なんとなくSSLとPKIとやらについて、[PKI]で分離できないままつらつらと書いています。ここでは OpenSSLのコマンドについて簡単なメモです。アルゴリズムは10年以上前のものだったりするので適時読み替えて。
LinuxでSSLというと、OpenSSLということにしておきましょう。何気なくApacheやPostgreSQLなどと組み合わせて使ったりしているのではないでしょうか。
バイナリとテキスト形式がありますが、バイナリ的なものは主にASN.1 DERという形をしています。テキストなのはそれをBASE64化したもので、頭に種類を付けています。その中からいくつかを挙げてみましょう。いくつあるのかよくわからないので見つけたら追加してみる予定。
拡張子はDERのもの、PEMのものはテキストかバイナリかしか示していないのであまりよいものではないかも。
ぐらいになっているとわかりやすいのかな。tls.key.pem など二重に拡張子をつけるのもいいかもしれない。private とか public とかファイル名につけなくてもいいと思う。説明では付けるけども。
RFC 7468 Textual Encodings of PKIX, PKCS, and CMS Structures などにもまとまっている。
-----BEGIN 形式名-----
のようなBASE64にヘッダフッタを付けた形式
-----BEGIN RSA PRIVATE KEY-----
暗号化されている場合、その方式のヘッダ等がつく SSHなどで使用される
PKCS#8形式
-----BEGIN PRIVATE KEY-----
秘密鍵(+公開鍵)、証明書なし、暗号化なし
-----BEGIN ENCRYPTED PRIVATE KEY-----
秘密鍵(+公開鍵)、証明書なし、暗号化あり
SSL証明書 (何形式かは不明 RSA,DSA共通)
-----BEGIN CERTIFICATE-----
公開鍵、証明書あり、暗号化なし
SSLの署名要求 (PKCS#10?)
-----BEGIN CERTIFICATE REQUEST-----
公開鍵、自己署名証明書?
GnuPG によるもの
-----BEGIN PGP PUBLIC KEY BLOCK-----
SSLの証明書発行手順とS/MIMEの秘密鍵/証明書発行手順は微妙に異なるようです。まぁ、送り方、受け取り方が違うだけで同じなんですけど。SSHの場合は証明書や認証局的なものは不要ですが、公開鍵を証明書にくるんだりせずそのままファイルにしています。秘密鍵は他のと同じようです。これもいろいろファイル形式がぁ・・・。
openssl だけ入力するとコマンドモードになったりします。
ハッシュというものの生成 (乱数つくるだけに使うのはあまり推奨しない) md系、sha1は古いので使わない方がいい。
ハッシュアルゴリズムは sha1,sha256,sha384,sha512,sha3-384,sha3-512 など
$ openssl md5 filename
$ openssl sha1 filename
$ openssl sha512 filename
$ openssl sha3-384 filename
$ openssl dgst {-md5|-md4|-md2|-sha|-sha1|-sha512} filename
$ openssl genrsa -out privkey.key [-rand 乱数ファイル] {-aes256} 鍵長 // 2048 か 3072 4096
暗号化したいとき -aes256 等をつける 鍵長は最後
-outform der は未対応っぽい
乱数ファイルはハッシュを生成したものを使うより、元のファイル(編集したOfficeファイルなど固有の中身のものがおすすめ)を指定する方がいいかもしれない。(謎)
$ openssl rsa -in privkey.key -out privkey.der
鍵の変換(秘密鍵?) -outform der をつけるとDER 形式つけないとPEM、-aes256 などをつけると暗号化、DERと暗号化の併用はできない
OpenSSHのssh-keygen も秘密鍵を生成できます。
$ openssl req -new
{
-key 秘密鍵 // 秘密鍵がある場合
|
-newkey rsa:3072 -keyout 秘密鍵ファイル // 新規の秘密鍵を生成する場合
}
{
-x509
-days 有効日数 x509のオプションが利用できる -out 自己署名証明書.crt // 自己署名証明書の場合
|
-out 署名要求ファイル名.req // 自己署名しない場合
}
鍵も作る場合 -newkey 行を付ける。自己署名証明書を作る場合 -x509 行を付ける。 署名要求の場合は -out 行のみ付ける。
-noenc を付けると秘密鍵を暗号化しない。(令和最新版?) 古いと -nodes かもしれない
-passout pass:xxxxx 出力用パスワード -passin pass:xxxxx 入力用パスワード などもあるのかも
ここ手動入力で困ったりしている人しかいない気がするが、-subj /CN=ホスト名 とか付けられるので参考に
などで指定できる。CNだけ重要。
認証局っぽい鍵と自己署名証明書を作る例
$ openssl req -new -newkey rsa:4096 -keyout CA.key -x509 -days 3650 -subj /C=JP/ST=Tokyo/ST=Suginami-ku/O=SiisiseNet/CN=ca.siisise.net -out CA.crt -noenc
$ openssl x509 -x509toreq -signkey 鍵ファイル.key -in 証明書.crt -out 署名要求.req
$ openssl x509 -req -signkey 鍵ファイル -in 署名要求.req -out 証明書.crt
$ openssl req -in 署名要求ファイル -text
PEMはBASE64でエンコードされたテキスト形式、DERはバイナリ形式。それを変換。他のコマンド中で -inform や -outform を指定してもいい
$ openssl x509 -in 証明書pem形式 -inform {PEM|DER} -out 証明書der形式 -outform {PEM|DER}
鍵と証明書の他の設定ファイルはシリアルナンバーだけ必要
$ openssl x509 -CA CAの証明書 -CAkey CAの鍵 -req -in 署名要求 -days 有効期限日数 -out 新証明書 -CAcreateserial
-CAcreateserial は初回のみ必要 拡張子 srl のシリアル番号ファイルが作られる
署名するだけです。鍵の漏洩した証明書を無効化する手段などはないので注意してください。
こっちは認証局のディレクトリを準備して…
サーバ用等のオプション属性が付加できます。
鍵と証明書のセットを作る
$ openssl pkcs12 -export -in 証明書 -inkey 鍵 [-certfile CAの証明書] -out pkcs12
-certfile はなくていい秘密鍵はpkcs8形式またはPEM形式である。
PEM形式の場合
$ openssl rsa -in ファイル名 -out ファイル名
PKCS#8の場合?
$ openssl pkcs8 -topk8 -in ファイル名.key -inform {pem|der} -out ファイル名 -outform {pem|der} -nocrypt