fabric-ca (v1.4.0) が作っている鍵ペア・証明書について (WIP)

# Status 

Work in progress

# 調査方法

`fabric-ca` を何も環境変数を指定しないで `docker run` で起動、できたコンテナの中に入って調べてみる。

# 調査結果

以下、ホームディレクトリを `$FABRIC_CA_HOME` として話を進める。
デフォルトではこのディレクトリは `/etc/hyperledger/fabric-ca-server` になる。

## 初期キー

まずデフォルトの鍵と証明書 `ca-key.pem` と `ca-cert.pem` が存在する。

> 実運用ではデフォルトを使わず、新たに生成したものを指定するべきである。

```bash
root@99208378ae24:/etc/hyperledger/fabric-ca-server# openssl ec -text -noout < ca-key.pem
read EC key
Private-Key: (256 bit)
priv:
    00:db:39:5e:8a:59:54:11:16:4e:c5:02:08:5f:26:
    53:81:f5:e3:f5:0d:d5:a9:68:fa:3e:41:cc:14:19:
    d0:f2:ad
pub:
    04:a2:07:e5:bd:89:69:29:aa:89:05:c7:ca:a0:be:
    72:69:27:20:27:05:8b:90:1d:75:58:ec:42:2c:c3:
    57:ab:99:e2:fe:ac:f8:f5:a2:27:2c:df:03:fa:d3:
    b4:cb:d8:00:fa:bf:c9:e1:07:a4:15:01:d6:3d:39:
    de:6c:67:a4:cb
ASN1 OID: prime256v1
NIST CURVE: P-256
```

```bash
root@99208378ae24:/etc/hyperledger/fabric-ca-server# openssl x509 -text -noout < ca-cert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            07:70:93:0c:e5:38:ee:c5:02:e4:ae:24:9f:f0:9a:aa:78:75:d7:86
    Signature Algorithm: ecdsa-with-SHA256
        Issuer: C=US, ST=California, L=San Francisco, O=Internet Widgets, Inc., OU=WWW, CN=example.com
        Validity
            Not Before: Oct 12 19:31:00 2016 GMT
            Not After : Oct 11 19:31:00 2021 GMT
        Subject: C=US, ST=California, L=San Francisco, O=Internet Widgets, Inc., OU=WWW, CN=example.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:a2:07:e5:bd:89:69:29:aa:89:05:c7:ca:a0:be:
                    72:69:27:20:27:05:8b:90:1d:75:58:ec:42:2c:c3:
                    57:ab:99:e2:fe:ac:f8:f5:a2:27:2c:df:03:fa:d3:
                    b4:cb:d8:00:fa:bf:c9:e1:07:a4:15:01:d6:3d:39:
                    de:6c:67:a4:cb
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Key Identifier:
                17:67:42:3D:AA:9E:82:3F:C4:C5:1D:9F:5B:C3:99:D1:B5:9C:48:10
            X509v3 Authority Key Identifier:
                keyid:17:67:42:3D:AA:9E:82:3F:C4:C5:1D:9F:5B:C3:99:D1:B5:9C:48:10

    Signature Algorithm: ecdsa-with-SHA256
         30:44:02:20:07:a7:94:5b:a7:d1:26:d4:6f:d4:98:a9:fc:5a:
         c0:9b:a8:37:d6:79:c5:5b:64:f4:23:dd:12:b8:a0:6e:64:41:
         02:20:40:07:b8:38:e2:98:84:97:61:dd:fe:d4:45:a2:9f:19:
         37:f8:f7:6f:e7:99:19:ad:2b:ec:92:2a:3a:47:4a:b5
```

次のことがわかる:

- `pub` フィールドから、前述の秘密鍵に (対応する公開鍵に) 関する証明書であること
- `Subject` と `Issuer` が同じであるし、`Subject Key Identifier` と `Authority Key Identifier` が同じであることから、オレオレ証明書であること

## Issuer{Public,Secret}Key

データベース (デフォルトでは `sqlite3`) をセットアップしたのち、CAは Issuer の鍵ペアなるものを作成する

- `/etc/hyperledger/fabric-ca-server/IssuerPublicKey`
- `/etc/hyperledger/fabric-ca-server/msp/keystore/IssuerSecretKey`

秘密鍵らしきものは `msp` の下で管理されている。サーバにHSMがある場合はそこに格納されるのだと思う。
どちらも謎のバイナリだった。特に、PublicKeyのほうは `EnrollmentID` らしき文字列が見えるので、Fabricが作成した、protobuf などによるデータ構造なのではないかと思っている。これ以降はソースの調査が必要かと思われる。