『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

PythonでPKCS12をPEMに変換する

はじめに

iOSエンジニアさんとかインフラエンジニアさんたちとかは多分よく耳にするであろう、 PKCS12 (以下、p12) を PEM形式にPythonを使って変換するやつです。

事前にOpenSSLが入っている端末であれば、以下で変換できます。

$ openssl pkcs12 -in /path/to/hoge.p12 -out /path/to/output/hoge.pem -nodes -clcerts

p12ファイルにパスワードが設定されている場合は、パスワードを入力してPEMを出力できますね。(パスワードなしの場合は忘れた。でるのかな?

環境

OpenSSL 等の環境がないと思うのでそこら辺は各自でお願いします。

そもそもp12とかPEMって

p12

PKCS 12 - Wikipedia

Wiki見て!!(説明することを放棄。自分がちゃんと完璧に理解していない)

PEM

e-words.jp

準備

pypi.python.org

$ pip install pyopenssl

無事インストールできたらコード書いていくぜ!

また、 pyOpenSSL のサポートしている OpenSSL のバージョンは以下です。

Installation — pyOpenSSL 22.0.0 documentation

サンプルコード

from OpenSSL import crypto

with open('/path/to/certificate.p12', 'rb') as p12_file, open('/path/to/output/certificate.pem', 'wb') as writer:
    p12 = crypto.load_pkcs12(p12_file.read(), 'passphase')  #  passphaseはp12のパスワード
    writer.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))
    writer.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))

/path/to/output/certificate.pem にちゃんと変換されました!チャンチャン!!

ミソなのは、 p12バイナリ読み込み して pemバイナリ書き出し するところでしょうか。

最後に

実際に今回の方法で書き出した、 pem をサーバにアップロードしてiOSアプリにプッシュ通知をしてみたところちゃんと送信されたので、動作に支障がないことがわかりました!

内容とは関係ないのですが、 with 構文のネストの書き方がいまいちまだわかっていない。もうちょっといい感じにかけるやつをマスターしたい。

今週の記事は結構手抜き。本当は、サーバ(Django)にHTMLのFormを使ってアップロードして保存するときに変換するやつとか書きたかったけどちょっと時間の都合上...