webサーバーをSSL/TLSを利用してhttpsにするための自己証明書(オレオレ証明書)の設定手順。

開発環境などローカル環境で利用することを想定しています。

SSL/TLSとは

SSL(Secure Sockets Layer)/TLS(Transport Layer Security)とは、インターネット上での送受信など通信を暗号化するプロトコル。

個人データ保護が注目される中、顧客情報やクレジットカード情報、IDやパスワードなどを扱う際にSSLを利用してhttpsを利用する。

SSLサーバー証明書

SSL/TLSを利用してhttpsで通信するにはSSLサーバー証明書をWEBサーバーに設定する必要がある。

本来は認証機関にお金を払って証明書を発行してもらう必要がある。

今回は開発環境での使用のため、自分で証明書を作成する自己証明書(オレオレ証明書)の作成手順を記載します。

公開サーバーならLet’s Encrypt

自己証明書はローカル環境内での使用を想定しています。

開発環境やテスト環境でも公開している(インターネット上にある)サーバーなら迷わず「Let’s Encrypt」がおすすめ。

無料でSSL証明書を発行できるし、ブラウザなどにも怪しまれないサーバー証明書を発行できる。

実験環境

  • CentOS7
  • OpenSSL
  • Apache

鍵や証明書の作成はCentOS7のOpenSSLを使用します。

CentOS7にOpenSSLが無い場合はインストールしてください。

秘密鍵を作成

以下のコマンドを実行して秘密鍵を作成します。

#openssl genrsa -out private-key.pem 2048

※秘密鍵を所持していればなりすましができるため、秘密鍵は大切に保管してください。

秘密鍵の中身を確認

秘密鍵を確認するにはtextオプションを使用する。

#openssl rsa -text -noout -in private-key.pem

設定ファイル作成

テキストエディタ(vi or vim)を使用して設定ファイルを作成する。

ファイル名はconf.cnfで保存

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = JP
ST = [都道府県]
L = [市町村]
O = [組織名]
CN = [発行者名]

[v3_req]
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @sja_name

[sja_name]
DNS.1 = [サーバードメイン]

設定ファイルの下記は編集する

ST:都道府県の名前(TOKYOなど)
L:市町村の名前
O:組織名の名前
CN:発行者名
DNS.1:サーバーの完全修飾ドメイン名

サーバー証明書を生成

以下のコマンドを実行してサーバー証明書を生成します。

#openssl req -new -x509 -days 3650 -key private-key.pem -config conf.cnf -out certificate.pem

-daysを3650で10年です、365なら1年。

-keyは秘密鍵の名前、-configは設定ファイルの名前を指定します。

-outは生成するcrt(証明書)の名前です。

証明書の確認

証明書を確認するにはtextオプションを使用する。

#openssl x509 -text -noout -in certificate.pem

SSLサーバー証明書作成は完了

ここまでで、SSLサーバー証明書の作成は完了です。

private-key.pemがkey(秘密鍵)。

certificate.pemがcrt(SSLサーバー証明書)です。

拡張子は.keyでも.crtでもかまいません、もちろん.pemのままでも大丈夫です。

「拡張子?あんなの飾りです。webサーバーにはそれが分からんのですよ。」

公開鍵(csr)は不要

今回は公開鍵(csr)は作成していません。

公開鍵はSSL証明書を作成する元になる情報が記載されています。

認証局(CA)に公開鍵(csr)を送って署名してもらいSSLサーバー証明書(crt)を発行してもらいます。

しかし今回は認証局(CA)に公開鍵(csr)を送らず自己証明書を作成するため不要です。

設定ファイルconf.cnfで代用です。

apacheのssl.conf作成

apache用のssl.confを作成します。

Listen 443
NameVirtualHost *:443
SSLStrictSNIVHostCheck off

apacheのhttpd-vhosts.confを編集

次にapache用のhttpd-vhosts.confを編集します。

<VirtualHost *:443>
DocumentRoot [ドキュメントルート]
ServerName [サーバードメイン]

SSLengine on
SSLCertificateFile [certificate.pemのパス]
SSLCertificateKeyFile [private-key.pemのパス]
</VirtualHost>

DocumentRoot:ドキュメントルートを記載
ServerName:サーバーのドメイン名
SSLCertificateFile:SSLサーバー証明書のパス
SSLCertificateKeyFile:秘密鍵のパス

apacheのhttpd.confを編集

必要な部分を追記やアンコメントしてください。

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-vhosts.conf
Include conf/extra/ssl.conf

Includeはファイルを保存した場所を指定する。

apacheの再起動

apacheを再起動します。

#systemctl restart httpd

ブラウザでアクセス

ブラウザでhttps://[サーバー名]にアクセスします。

自己証明書なので警告がでますが、「「サーバー名」にアクセスする(安全ではありません)」をクリックするとサイトが表示されます。

これでSSL/TLSによるhttpsの設定完了です。

ブラウザの警告を出なくする

ブラウザの警告を出ないようにするには、サーバー証明書を信頼させる必要があります。

証明書の管理の「信頼のルート機関」的なところにSSL証明書(crt)を登録するだけでサクッと行けます。

詳しいやり方はそのうち追記します。

まとめ

自宅のPCや社内に転がっているサーバーをhttpsにするための手順です。

開発環境やテスト環境がインターネットからアクセスできるのであれば「Let’s Encrypt」をおすすめします。