自己証明書を作成してnginxで使う その1

自己サーバ証明書(オレオレ証明書)を作成し、nginxでHTTPS通信ができるようにします。

サーバ証明書を作成するためには、

  1. 秘密キーの生成
  2. 秘密キーから証明書署名要求ファイルを作成
  3. 証明書署名要求ファイルからサーバ証明書を作成

のステップで行います。

秘密キーの作成

最初に秘密キーを作成しましょう。 シェルでopenssl genrsa -out server.key -aes128 1024と入力してください。 以下のようになります。

$ openssl genrsa -out server.key -aes128 1024
Generating RSA private key, 1024 bit long modulus
..........................++++++
..............++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:

作成の途中で、秘密キーを保護するためのパスフレーズの入力が求められます。Enter pass phrase:の部分です。 パスワード(単語)ではなくパスフレーズ(語句)なので、長めのものがいいでしょう。

パスフレーズ確認のためのプロンプトがVerifying - Enter pass phrase:と表示されます。同じフレーズを入力してください。

パスフレーズが一致しないと

Verify failure
User interface error
2404:error:0906906F:PEM routines:PEM_ASN1_write_bio:read key:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/pem/pem_lib.c:334:

などと表示されてキーは生成されません。

パスフレーズが一致していれば、秘密キーがserver.keyファイルに作られます。

証明書署名要求ファイルの作成

秘密キーができたら、証明書署名要求(certificate signing request)ファイルを作りましょう。

シェルでopenssl req -new -key server.key -out my_domain.csrと入力してください。 次のようになります。

$ openssl req -new -key server.key -out my_domain.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Chiyoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:my.domain
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:www.my.domain
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

ここではいくつかの項目を入力しなければなりません。すべて半角英数字でないとならないと思われます。

プロンプト入力する内容
Enter pass phrase for server.key: server.keyのパスフレーズ。
Country Name (2 letter code) [AU]: 国名コード。
State or Province Name (full name) [Some-State]: 州とか都道府県の名前。
Locality Name (eg, city) []: 市町村の名前。
Organization Name (eg, company) [Internet Widgits Pty Ltd]: 組織や会社の名前。
Organizational Unit Name (eg, section) []: 組織や会社の部署名。空欄でもいいです。
Common Name (eg, YOUR name) []: httpsでアクセスできるようにするドメイン名。(ここ重要!)
Email Address []: メールアドレス。空欄でもいいです。
A challenge password []: 証明書署名要求のパスワード。自己証明なので空欄にします。
An optional company name []: 会社名。空欄にします。

これで、my_domain.csrファイルが生成されます。

あと、国名コードについてはここからどーぞ。表中の"ISO 3166-1-alpha-2 code"の欄をご覧ください。日本ならJPです。

証明書署名要求ファイルからサーバ証明書を作成

証明書署名要求ファイルができたら、自分でサーバ証明書を作成しましょう。

$ openssl x509 -req -in my_domain.csr -signkey server.key -out my_domain.crt
Signature ok
subject=/C=JP/ST=Tokyo/L=Chiyoda-ku/O=my.domain/CN=www.my.domain
Getting Private key
Enter pass phrase for server.key:

ここでもEnter pass phrase for server.key:とプロンプトが表示され、server.keyのパスフレーズを入力します。

パスフレーズが誤っていると次のようにエラーが表示されます。

unable to load Private key
2492:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/evp/evp_enc.c:330:
2492:error:0906A065:PEM routines:PEM_do_header:bad decrypt:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/pem/pem_lib.c:428:

パスフレーズが正しければ、my_domain.crtファイルが生成されます。これが証明書になります。

自己証明書を作成してnginxで使う その2へつづく。