はじめに
Let's Encrypt の証明書を発行するのに Certbot を使う時は、はじめにアカウントが作られます。このアカウントの鍵は JWK (JSON Web Key) 形式で収められているのですが、ここから openssl
で使われるPEM形式に変換するスクリプトを書きました。
アカウント鍵
以下の場所にあります。(XXXX
の部分はアカウントIDです)
/etc/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/XXXX/private_key.json
変換スクリプト
import sys
import json
import base64
with open(sys.argv[1]) as fp:
pkey = json.load(fp)
print('asn1=SEQUENCE:private_key\n[private_key]')
print('version=INTEGER:0')
for k,v in pkey.items():
if k == 'kty':
continue
missing_padding = 4 - len(v) % 4
if missing_padding != 4:
v = v + ('='*missing_padding)
v_hex = base64.urlsafe_b64decode(v).hex().upper()
print('{}=INTEGER:0x{}'.format(k, v_hex))
参考にしたスクリプトはここにあります
……が、ちょっと変なコードだった&Python 3系で動作しないので作り替えました。
https://github.com/szepeviktor/debian-server-tools/blob/master/security/jwk_convert.py
使い方
スクリプトを実行すると、openssl
の asn1parse
サブコマンドで扱えるファイルを出力します。
python jwk_to_pem.py private_key.json > private_key.asn1
それを使って、まずDER形式のファイルを作り、最後にPEM形式にします。
openssl asn1parse -genconf private_key.asn1 -noout -out private_key.der
openssl rsa -inform der -in private_key.der -outform pem -out private_key.pem
以上です。
参照
RSA鍵、証明書のファイルフォーマットについて - Qiita
ASN.1とかDERとかPEMとか、そういったものに興味がある方は、こちらに情報がまとまっています。
RSA 秘密鍵/公開鍵ファイルのフォーマット - bearmini's blog
ちょっとマニアックですが、DER形式について詳説されています。