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.