Fabric CA
운영 시 관리하는 인증서
- CA 자가 서명 인증서(payprotocol-ca, exchange-ca, auditor-ca)
- CA 서버에 저장
- MSP 디렉토리 구조에서 msp/cacerts에 있는 파일이다. 이 파일을 바탕으로 어떤 CA로부터 인증을 받았는지 알 수 있다.
- CA/fabric-ca-server/ca-cert.pem 파일이다. CA 서버가 구동 되면 생성된다.
- CA server가 CA client로부터 받은 enroll 명령을 처리하여 user들의 인증서를 발급해줄 때 CA서버가 해당 인증서들에 서명을 해주기 위해 사용된다.
- CA admin(Registrar) 인증서(Payprotocol, Exchange, Auditor)
- Bastion에 저장
- fabric-ca-server-config.yaml에 기입되었던 ID, PW로 CA server가 구동 되면 자동으로 register가 된다.
- CA client로 enroll 받아서 user들을 CA에 register, enroll 할 때 사용되는 인증서이다.
- registrar : a person or organization whose jib is to keep official records
- Org admin(Channel Admin) 인증서(admin-payprotocol, admin-exchange, admin-auditor)
- Bastion에 저장
- Org 별로 각 CA(payprotocol, exchange, auditor)에 등록된 인증서로, 컨소시엄(payprotocol channel을 구성하는 PayConsortium)을 구성하고 있는 조직(Organization)을 대표
- Config Block에 각 Org 별로 Org의 admin으로 등록되어 있다. 초기 네트워크 설정 시 genesis block에 정보가 포함되었다.
- Network를 업데이트 하거나 Channel을 업데이트 할 때 사용한다.
- payprotocol 인증서를 통해 peer를 channel에 등록
- payprotocol-orderer 인증서를 통해 orderer를 channel에 등록
- exchange 인증서를 통해 거래소 ICA의 ca-chain.pem을 channel에 등록
- 하이퍼레저 패브릭 서버에 접속하는 방법은 두가지가 있는데 첫 번째는 CA client를 통해서 이고, 두 번째는 Fabric SDKs를 이용한다.
- 모든 통신은 REST APIs를 통해서 진행된다. Fabric CA client or SDK은 클러스터형태의 서버와 연결되어 있을 수 있다.
- 클러스터들은 인증서와 신원을 공유한다. 만약 LDAP가 구성되면, 신원 정보는 데이터베이스가 아닌 LDAP에 보관된다.
Fabric-CA-Server의 역할
- Fabric-CA Server는 우리의 맞춤 CA 역할을 하며 기존 사용자뿐만 아니라 신규 사용자도 데이터베이스에 등록하고 등록한다. 서버는 이미 등록(register)된 사용자를 등록(enroll)하려고 할 때 키 쌍을 보낸다.
Start Server Natively - CLI 명령어로 Server Start
- 서버를 구동해보자. 아래 명령어로 fabric-ca 서버를 구동하면 이 ID와 PW로 자동으로
register
가 된다.
fabric-ca-server start -b "CA_ADMIN:CA_ADMINPW”
- (중요!!!)
- CA 서버를 구동시켰으므로 자가인증서명(ca-cert.pem)과 개인키(ca-key.pem)이 생성
- CA_ADMIN을 register 했으니, enroll 해야하는데, CA Client로 enroll을 받으면 CA Admin 인증서가 생성된다.
- 그러면 이제 이 CA Admin으로 Fabric-CA Client가 CA 서버에 User들의 register, Enroll 요청을 날릴 수 있게 된다.
private static void registerExample(String username, String password) throws Exception {
// Create a HFCAClient object, which will execute the register API.
NetworkConfig networkConfig = NetworkConfig.fromYamlFile(new File(configFilePath));
OrgInfo orgInfo = networkConfig.getClientOrganization();
CAInfo caInfo = orgInfo.getCertificateAuthorities().get(0); // Assume that we have only 1 CA info in config
// file.
HFCAClient caClient = HFCAClient.createNewInstance(caInfo);
// The register API needs the certificate and private key of authorized
// registrar, which uses
// same java classes as general users. So they also can be obtained by
// HFCAClient.enroll().
String adminId = CA_ADMIN;
Enrollment enrollment = null;
try {
enrollment = loadEnrollmentFromStore(adminId);
} catch (Exception e) {
logger.info("enroll CA admin");
String adminPw = CA_ADMINPW;
enrollment = caClient.enroll(adminId, adminPw);
saveEnrollmentToStore(adminId, enrollment);
}
UserImpl admin = new UserImpl(enrollment);
// Create a request object which contains the username and password of the user.
RegistrationRequest registrationRequest = new RegistrationRequest(username);
registrationRequest.setSecret(password);
// ACTUAL EXECUTION
// An exception may be thrown if given username is already registered.
// This try-catch statement is just for repeating the test with the fixed
// username.
try {
caClient.register(registrationRequest, admin);
} catch (Exception e) {
logger.error(e);
}
}
- fabric-ca-server-config.yaml파일을 열어보면
enabled를 true로 하면 http가 아닌 https로부터 통신할 수 있다.
Start Server via Docker - docker-compose-up 명령어로 Server Start
cd fabric-ca/ docker-compose up -d
Initializing the server
- fabric-ca-server.db는 등록된 모든 유저의 정보를 담고있다. fabric-ca-server-config.yaml의 파일은 중요한 파일이기 때문에 세부사항을 알아야 한다.
-
fabric-ca-server-config.yaml 파일을 열어보면 csr(인증서 서명 요청) 부분을 볼 수 있다.
Issuer + Subject 정보를 그대로 해서 인증서를 발급했을 때만 동일한 계좌에 접근이 가능하다.
Issuer나 Subject의 C,O,OU,CN등의 정보가 변경되면 주소가 바뀐다.
원리 : Issuer+Subject의 정보를 해싱하여 CSR을 만들고 CSR을 가지고 cid를 만듭니다. cid를 가지고 kid를 만들며, kid로 address를 만든다.
CA를 재구동할때 CA의 CSR정보(CA의 C,O,OU,CN 부분)를 변경해버리면 Issuer정보가 바뀔수 있다.
Fabric-CA-Client의 역할
부트스트랩 ID등록(enroll)
- ID가 admin이고 패스워드가 adminpw인 신원등록.
- 서버를 구동할 때 admin유저를 데이터베이스에 등록(register)했었다.
- 이제 그것을 이용해 admin 유저를 등록(enroll)하고 키쌍을 되찾아서 새로운 유저들을 등록(register)할 수 있도록 한다.
- fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
- “admin:adminpw”는 실제로 “username:password” 쌍으로 localhost:7054로 보내야 한다. localhost:7054는 서버가 수신받는 기본 url과 port이다.
- 위 과정을 수행하면 cert.pem(공개키) , key.pem(개인키)가 생성되고, 처음으로 유저를 등록했기 때문에 fabric-ca-client-config.yaml또한 생성된다.
- 사용자의 msp/keystore/~~_sk 파일은 key.pem과 같으며,
openssl pkey -noout -text -in ~~~.sk
명령어로 pubkey를 확인할 수 있으며,- cert.pem을 openssl x509 명령어로 열었을 때, 위 pubkey와 같은지 확인한다.
- 이는 key.pem(Private Key)에 대한 Pubkey를 인증서에서 확인가능하다는 의미.
새로운 User 등록
- 사용자를 등록하기 위해서는, Fabric-CA-Client가 Fabric-CA 서버에게 등록해주세요~ 하고 요청해주어야한다.
- 이때, Fabric-CA-Client에게 register/enroll 요청권한을 부여할 수 있는 인증서가 CA-ADMIN 인증서이다. (ca-client의 역할은 그냥 register,enroll하는 역할만 할 뿐!!)
- 따라서, 이 CA Admin이 없다면 사용자도 등록안된다
- 이제 아래의 명령어로 새로운 유저를 생성하고 등록한다.
-
fabric-ca-client register -u “http://localhost:7054” --id.name “jiwon”--id.secret “mlg” --id.type “client” --id.affiliation “org1.department1”
- id.name : 유저의 이름
- id.secret : 유저가 등록할 패스워드
- id.affiliation : 사용자가 소속된 조직과 부서가 있다. 주로 사용자 권한을 분리한다.
- id.type : 유저의 종류(peer, validator, ca, client)등이 있다.
- 이제 가입한 유저를 서버에 등록해서 유저 jiwon에 대한 공개키/개인키를 얻을 것이다.
-
fabric-ca-client enroll -u http://jiwon:mlg@localhost:7054
-
피어 신원 등록
-
fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
- 생성한 ID(peer1)와 패스워드(peer1pw)를 사용하여 peer1 등록
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
다른 CA서버로부터 CA인증서 가져오기
- 포트번호가 7055이고 이름이 “CA2”인 CA서버를 시작한다. 이는 트러스트체인의 루트가 다르며 서로 다른 관리자가 관리한다.
- export FABRIC_CA_SERVER_HOME=$HOME/ca2
- fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2