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進文字列をそれぞれ変換する関数です。サンプルがネットにありましたので,それをそのまま使っています。
