OpenSSLを使ってオレオレ認証局を構築し,オレオレ証明書を発行することができました。次は,その証明書を使って暗号処理を実行してみます。
PKI公開鍵証明書で,暗号アルゴリズムはRSAの公開鍵を作成しましたから,署名などの公開鍵暗号方式を利用することができます。まずは,PKCS#12をデコードして鍵のコンポーネントを取得します。
RUBYのソースサンプル
RUBYだとこうやってPKCS#12ファイルをデコードします。
# OpenSSLの動作を確認するサンプル require 'openssl' # util class # バイナリと16進文字列の変換 class String def hex2bin s = self raise "Not a valid hex string" unless(s = ~ /^[\da-fA-F]+$/) s = '0' + s if((s.length & 1) != 0) s.scan(/../).map{ |b| b.to_i(16) }.pack('C*') end def bin2hex self.unpack('C*').map{ |b| "%02x" % b }.join('') end end # PKCS#12ファイルをデコードする def decode_pkcs12(p12_file, pw = '1111') # PKCS#12ファイルを開く f = File.new(p12_file) p12 = OpenSSL::PKCS12.new(f, pw) f.close # 証明書、鍵ペア、DN、シリアル番号を取り出す cer = p12.certificate.to_der priv_key = p12.key pub_key = priv_key.public_key.to_der # 公開鍵を取得 dn_bin = p12.certificate.subject.to_der.bin2hex # DNをバイト列で取得 dn = p12.certificate.subject.to_s # DNを文字列で取得 serial = p12.certificate.serial.to_s(16) # シリアル番号を取得 # 公開鍵をモジュラスとPublic Expornentに分離する n = p12.key.n.to_s(16) e = p12.key.e.to_s(16) # 各データの長さを取得する dn_len = dn.length dn_bin_len = dn_bin.length/2 serial_len = serial.length/2 n_len = n.length/2 e_len = e.length/2 # それぞれを表示する printf("n(%d) = ", n_len) printf(n) printf("\n") printf("e(%d) = ", e_len) printf(e) printf("\n") printf("serial(%d) = ", serial_len) printf(serial) printf("\n") printf("dn(%d) = ", dn_len) printf(dn) printf("\n") printf("dn_bin(%d) = ", dn_bin_len) printf(dn_bin) printf("\n\n") end # 呼び出し print "OpenSSLで証明書をデコードする。\n" decode_pkcs12('newcert.p12', '1111')
割とあっさりしたコードです。OpenSSLを使うと,PKCS#12ファイルをデコードして各コンポーネントを取り出すのは簡単です。C言語で書こうとすると,かなり苦労するのですが,さすが高級言語です。
実行結果
実行結果は次の通り。
OpenSSLで証明書をデコードする。 n(256) = C0359274D641F2C068D83129C15B00E3F28ADFE23EFC55E4146FE23328A21CFFB70A917AB2F6F5CC51F4D16703054C64229107E069A2CBEE240F006DB3468C81D67AC060E26C6640406055FBD9CF9C1ED1588D0B349FA209439FF28DC46197D5345A2137E34EE72E7BCE1DCB4BF8D549E53A044142FBA48721F7EDD0E01BA0B78DF95C578E5A2CDB18ED3A84B2599B0E9FFE8281A73A4C391B17F74580412B1729F99829C065374D63045D6C094DE6908BA7EC52E5377AD01CB9272A5758E8CE90BC72694E1B7E55B6E0D0188A053EF075ED3D562E9C30435EBA2C8641B23625DC5E86DD443D2F66545C8739DD1DD3EE1647607ACBB5EF627A7B567E666AD525 e(3) = 010001 serial(8) = C3B0ACCB999BD8DB dn(101) = /C=JP/ST=Tokyo/L=Edogawa/O=Trusted Design/OU=CertUsers/CN=user1/emailAddress=user1@trusted-design.net dn_bin(152) = 308195310b3009060355040613024a50310e300c06035504080c05546f6b796f3110300e06035504070c0745646f6761776131173015060355040a0c0e547275737465642044657369676e31123010060355040b0c09436572745573657273310e300c06035504030c0575736572313127302506092a864886f70d0109011618757365723140747275737465642d64657369676e2e6e6574
OpenSSLのオレオレ認証局から発行した証明書はこちらですから,モジュラスもDNも正しい値を取得できています。
Certificate: Data: Version: 3 (0x2) Serial Number: c3:b0:ac:cb:99:9b:d8:db Signature Algorithm: sha256WithRSAEncryption Issuer: C=JP, ST=Tokyo, O=Trusted Design, OU=myCA, CN=myCA/emailAddress=admin@trusted-design.net Validity Not Before: Mar 19 22:35:27 2016 GMT Not After : Mar 19 22:35:27 2036 GMT Subject: C=JP, ST=Tokyo, L=Edogawa, O=Trusted Design, OU=CertUsers, CN=user1/emailAddress=user1@trusted-design.net Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:c0:35:92:74:d6:41:f2:c0:68:d8:31:29:c1:5b: 00:e3:f2:8a:df:e2:3e:fc:55:e4:14:6f:e2:33:28: a2:1c:ff:b7:0a:91:7a:b2:f6:f5:cc:51:f4:d1:67: 03:05:4c:64:22:91:07:e0:69:a2:cb:ee:24:0f:00: 6d:b3:46:8c:81:d6:7a:c0:60:e2:6c:66:40:40:60: 55:fb:d9:cf:9c:1e:d1:58:8d:0b:34:9f:a2:09:43: 9f:f2:8d:c4:61:97:d5:34:5a:21:37:e3:4e:e7:2e: 7b:ce:1d:cb:4b:f8:d5:49:e5:3a:04:41:42:fb:a4: 87:21:f7:ed:d0:e0:1b:a0:b7:8d:f9:5c:57:8e:5a: 2c:db:18:ed:3a:84:b2:59:9b:0e:9f:fe:82:81:a7: 3a:4c:39:1b:17:f7:45:80:41:2b:17:29:f9:98:29: c0:65:37:4d:63:04:5d:6c:09:4d:e6:90:8b:a7:ec: 52:e5:37:7a:d0:1c:b9:27:2a:57:58:e8:ce:90:bc: 72:69:4e:1b:7e:55:b6:e0:d0:18:8a:05:3e:f0:75: ed:3d:56:2e:9c:30:43:5e:ba:2c:86:41:b2:36:25: dc:5e:86:dd:44:3d:2f:66:54:5c:87:39:dd:1d:d3: ee:16:47:60:7a:cb:b5:ef:62:7a:7b:56:7e:66:6a: d5:25 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 2B:72:8F:AD:C4:3F:27:38:A1:0D:5F:07:0E:37:00:29:72:CF:C6:18 X509v3 Authority Key Identifier: keyid:D0:59:65:97:90:8C:DA:A2:EC:5F:79:94:4C:AF:5E:94:FB:C1:B2:23 Signature Algorithm: sha256WithRSAEncryption 9f:72:e2:9d:b5:4c:58:ff:52:16:58:a6:33:a9:a7:6b:5b:9a: 81:99:4c:44:9f:35:77:81:dd:22:e9:0b:3e:b4:be:cd:52:e3: bf:d1:c2:82:98:95:1d:00:b3:ba:2e:e2:52:e0:61:5a:a6:4a: 60:a8:6d:3c:6e:97:0f:9f:01:87:d0:78:13:84:1e:30:66:b4: bd:c6:48:96:7e:6b:2f:78:2e:3c:c1:61:30:d5:91:c8:b1:a1: bd:2b:d8:45:2e:6f:f1:a2:78:4e:10:27:d5:f9:d7:58:ef:de: 94:d1:bb:ed:a7:4e:84:e4:f7:29:15:3a:e5:13:a0:b5:51:3a: 0c:0d:08:6d:f4:67:b2:6d:67:d4:24:29:8f:29:02:b0:3f:52: 1d:86:5c:33:a1:8d:45:61:a3:ba:30:be:25:49:6c:b9:3a:68: 69:dc:9e:80:93:7e:ab:f4:33:bf:93:3c:f6:e2:0a:c4:74:30: ae:0b:98:4f:fc:3b:5c:11:4e:f4:bd:16:a0:2e:c4:09:59:b6: 2e:f8:53:e0:99:c1:ba:48:a1:58:af:38:66:8a:76:ee:d8:49: 07:e5:33:c0:0a:1a:23:92:c4:e6:5f:3d:41:5a:0c:64:e0:a0: a2:8b:e3:27:5f:12:2f:2c:9e:2f:66:67:d5:d9:e8:92:19:a8: 6a:66:71:9d
RUBYのソースの先頭にある,hex2binとbin2hex関数は,バイナリと16進文字列をそれぞれ変換する関数です。サンプルがネットにありましたので,それをそのまま使っています。