0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Certbotのアカウント鍵(JWK形式)をPEM形式に変換する

Last updated at Posted at 2020-06-07

はじめに

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

変換スクリプト

jwk_to_pem.py
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

使い方

スクリプトを実行すると、opensslasn1parse サブコマンドで扱えるファイルを出力します。

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形式について詳説されています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?