Pythonを使って証明書から公開鍵を取り出してみる

どうも!大阪オフィスの西村祐二です。Pythonを使って証明書から公開鍵を取り出すという場面に出くわしたので、その方法を紹介したいと思います。今回、外部ライブラリのpyOpenSSLを使ってやっていきます。
2018.07.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも!大阪オフィスの西村祐二です。

Pythonを使って証明書から公開鍵を取り出すという場面に出くわしたので、その方法を紹介したいと思います。

今回、外部ライブラリのpyOpenSSLを使ってやっていきます。

pyOpenSSLはけっこう高機能で、Pythonにデフォルトで入っているsslのライブラリではできないようなことを簡単にできたりします。ただ、書き方など少しクセがあるようにかんじたので、備忘録もかねてブログ化しておきたいと思います。

使用する証明書

今回、使用するサンプル証明書はAWSより公開されているサーバ証明書を使いたいと思います。

下記リンク先のAWS IoTのページのRSA 2048 ビットキー: VeriSign クラス 3 Public Primary G5 ルート CA 証明書から取得することができます。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/managing-device-certs.html

ダウンロードリンクはこちらです。

この証明書をローカルに保存しておきます。

環境

  • macOS High Sierra 10.13.6
  • Python 3.6.0

インストール

$ pip install pyopenssl

プログラム

最終行のところのファイルパスは各々変更してください。

import OpenSSL


def get_pubkey(file_path):
    """証明書から公開鍵を取得する."""
    # 証明書をopen
    pem_file = open(file_path, 'rb')

    # byteに変換
    buffer = pem_file.read()

    # 証明書を読み込み
    pemCert = OpenSSL.crypto.load_certificate(
        OpenSSL.crypto.FILETYPE_PEM, buffer)

    # 公開鍵を取得
    pubkey = OpenSSL.crypto.dump_publickey(
        OpenSSL.crypto.FILETYPE_PEM, pemCert.get_pubkey())

    print(pubkey)


get_pubkey('/Users/nishimura.yuji/Downloads/VeriSign-Class 3-Public-Primary-Certification-Authority-G5.pem')

実行

上記のプログラムを実行すると、下記のように出力されます。想定どおり、公開鍵の情報が出力されていることがわかります。

b'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAryQICCl6NZ5gDKrnSztO\n3Hy8PEUcuyvg/ikC+VcIo2SFFSf18a3IMYldIugqqqZCs4/4uVW3sbdLs/6PfgdX\n7O9D22ZiFWHPYA2k2N744MNiCD1UE+tJyllUhSblK48bn+v1oZHCM0nYQ2NqUkvS\nj+hwUU3RiWl7x3D2s9wSdNt7XUtW05a/FXehsPSiJfKvHJJnGOX0BgTvkLnkAOTd\nOrUZ/wK69Dzu4IvrN4vs9Nes8vbwPa/ddZEzGR0cQMt0JBkhk9kU/qwqUseP1QRJ\n5I1jR4g8aYPL/ke9K35PxZWuDp3U0UPAZ3PjFAh+5T+fc7gzCs9dPzSHloruU+gl\nFQIDAQAB\n-----END PUBLIC KEY-----\n'

さいごに

いかがだったでしょうか。

Pythonを使って証明書から公開鍵を取り出す方法を紹介しました。

今回使用したpyOpenSSLはとても高機能でできることがいっぱいあるので、今後も使い方など紹介していきたいと思います。

誰かの参考になれば幸いです。