OpenSSLでPKCS#12ファイルをデコードしましたので,次は,そのカギを使って署名/署名検定を実行してみましょう。
概要
PKCS#12ファイルをデコードし,証明書と秘密鍵ペアを取り出します。秘密鍵で署名を実行して,証明書で署名検定を実行します。
サンプルソース
OepnSSL.crypto.verify関数は,署名検定に失敗すると例外を発生します。署名検定に成功すると,何も返しません(戻り値がNoneになります)。
# -*- coding: utf-8 -*-
# RSAの暗復号署名/署名検定を実行する
import OpenSSL
import binascii
# PKCS#12ファイルをデコードする
# PKCS#12ファイルを入力すると,鍵ペアが返る
def decodeP12(p12File, pwd='1111'):
# PKCS#12ファイルをオープンする
p12_input = open(p12File, 'rb')
try:
buffer = p12_input.read()
finally:
p12_input.close()
# PKCS#12ファイルをデコードする
p12 = OpenSSL.crypto.load_pkcs12(buffer, pwd)
# 証明書と秘密鍵を取得する
userCert = p12.get_certificate()
caCert = p12.get_ca_certificates()
priKey = p12.get_privatekey()
return priKey, userCert, caCert
# データを署名する
# 秘密鍵と平文を入力すると,署名データが返る
def sign(priKey, plainText, userCert):
return OpenSSL.crypto.sign(priKey, plainText, 'sha256')
# 署名検定する
# 証明書と署名データと平文を入力,署名が不一致だと例外が発生する。
def verify(userCert, signedText, plainText):
OpenSSL.crypto.verify(userCert, signedText, plainText, 'sha256')
# 呼び出し
if __name__ == '__main__':
text = 'This is a plain text.'
print('plaintext\n%s' % text)
priKey, userCert, caCert = decodeP12('user2.p12', '1111')
signedText = sign(priKey, text, userCert)
print('signedText\n%s' % binascii.hexlify(signedText))
verify(userCert, signedText, text)
print('verify success.')
実行結果
実行結果はこの通りです。
plaintext This is a plain text. signedText b'42972e9d9aeff9fb602c9e967976cb36099ace80960f9b8a3820a3f7e0ccc980ed68bfa54d88aee007da2b833db7b96fcf51457455c1a287e6a6ec493c5171386f8abe794b1d4ef0547ef21612eb58b19b2a6cc0180965b3f5095dcb57c39138801f017d0eef880dc0c204ea7a0320706df56d1f8730e0c84b874ba358a9337b9bf397739d61be8c6e4b0c12fcbbe31f3082f8265f92db8092d9e119de111c161db59e2e8cea861fcbee1d489a229ead29b2e85e9991d50a2c342f8e9d40b728b6e000c1fefeffaca3a658d19274f1a85bddebe73fede70866839e59ff0fe0f6feb730f7e66ce4fa84f81b511f2a506b3d0925c09b5103a86bc0bbddb6e0633b' verify success.
