〜 卓越した品質へ 〜

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です