akiyoko blog

akiyoko の IT技術系ブログです

AWS で自己署名証明書を使ってみる

AWS で自己署名証明書(通称、オレオレ証明書)を使ってみようと思います。


自己署名証明書については、に全部書いてあります。

お急ぎの方は、以下3つだけやれば良い。これで10年間(3650日)有効なオレオレ証明書ができあがる。

$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

こうして見て分かった通り、サーバ証明書は、「サーバの公開鍵と、サーバのSubject(組織名・FQDNなど)と、有効期限」と、「それに付けられた認証曲(CA)の電子署名」のセットである。


本当に素晴らしい記事です。とても分かりやすいです。


AWS のノウハウについては、以下の本をベースにしました。
こちらも非常に分かりやすいです。オススメ。

Amazon Web Services クラウドデザインパターン実装ガイド 改訂版

Amazon Web Services クラウドデザインパターン実装ガイド 改訂版

  • 作者: 大澤文孝,アマゾンデータサービスジャパン玉川憲,アマゾンデータサービスジャパン片山暁雄,アイレット鈴木宏康,日経SYSTEMS
  • 出版社/メーカー: 日経BP社
  • 発売日: 2015/03/05
  • メディア: 単行本
  • この商品を含むブログ (2件) を見る
Amazon Web Services クラウドデザインパターン 実装ガイド 改訂版 日経BP Next ICT選書

Amazon Web Services クラウドデザインパターン 実装ガイド 改訂版 日経BP Next ICT選書

  • 作者: アマゾンデータサービスジャパン玉川憲,片山暁雄,アイレット鈴木宏康
  • 出版社/メーカー: 日経BP社
  • 発売日: 2015/04/01
  • メディア: Kindle版
  • この商品を含むブログを見る

 


 

1. EC2インスタンスの Apache (mod_ssl) に自己署名証明書をインストールする場合

1) EC2インスタンス作成

まず、EC2インスタンスを起動します。

Region: Tokyo
VPC: T1 (10.0.0.0/16)
Subnet: T1-Public #1 (10.0.0.0/24)
SG: T1-Web (22, 80, 443番を許可)
EC2: T1-Web #1 (Amazon Linux AMI)

f:id:akiyoko:20150524182938p:plain

f:id:akiyoko:20150524182950p:plain

Security Group 作成時に、443番ポートを許可しておきます(80番は任意)。
f:id:akiyoko:20150524183004p:plain

インスタンスが起動できたら、endpoint を確認します。
f:id:akiyoko:20150524183017p:plain


2) Apache, mod_ssl のインストール

EC2インスタンスに SSH で乗り込みます。(Mac の場合)

$ chmod 600 ~/Downloads/T1-key.pem
$ ssh -i ~/Downloads/T1-key.pem ec2-user@ec2-52-68-199-51.ap-northeast-1.compute.amazonaws.com

以降、root で操作します。

$ sudo -i

Apache, mod_ssl, openssl がインストールされているかを確認します。
Apache, mod_ssl がインストールされていないようなので、インストールします。

# rpm -qa | grep httpd
# rpm -qa | grep mod_ssl
# rpm -qa | grep openssl
openssl-1.0.1k-1.82.amzn1.x86_64

# yum -y install httpd
# yum -y install mod_ssl

# httpd -v
Server version: Apache/2.2.29 (Unix)
Server built:   Mar 12 2015 03:50:17
# openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015

 

3) 秘密鍵、自己署名証明書の作成

秘密鍵、自己署名証明書を作成します。

# openssl genrsa 2048 > server.key

### 途中の入力は全てデフォルトで(Enterキー連打)
# openssl req -new -key server.key > server.csr
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

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

# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting Private key


 

4) mod_ssl の設定

作成した秘密鍵と自己署名証明書を所定の位置(基本的にどこでもよいが、ある程度の流儀があるっぽい)に配置します。

# cd /etc/httpd/conf
# mkdir ssl.crt
# mkdir ssl.key -m 700
# mv /root/server.crt ssl.crt/
# mv /root/server.key ssl.key/
# chmod 400 ssl.key/server.key


ssl.conf を編集します。
なお、自己署名証明書を使う場合は、中間CA証明書に関する記述は不要となります。

vi /etc/httpd/conf.d/ssl.conf


(変更前)

<VirtualHost _default_:443>

# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443
  ・
  ・
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/pki/tls/certs/localhost.crt

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
  ・
  ・
</VirtualHost>


(変更後)

<VirtualHost _default_:443>

# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/html"
ServerName www.example.com:443
  ・
  ・
#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# the certificate is encrypted, then you will be prompted for a
# pass phrase.  Note that a kill -HUP will prompt again.  A new
# certificate can be generated using the genkey(1) command.
SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt

#   Server Private Key:
#   If the key is not combined with the certificate, use this
#   directive to point at the key file.  Keep in mind that if
#   you've both a RSA and a DSA private key you can configure
#   both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
  ・
  ・
</VirtualHost>


 

5) Apache の起動

httpd を起動します。もし起動済みなら、reload で再起動します。

# service httpd configtest
Syntax OK
# service httpd start
Starting httpd:                                            [  OK  ]

これで設定は完了です。


EC2インスタンスのホスト名を使って、
https://ec2-52-68-199-51.ap-northeast-1.compute.amazonaws.com/
にアクセスしてみます。

f:id:akiyoko:20150524183028p:plain

f:id:akiyoko:20150524183150p:plain

確認できました。


ここで、index.html を配置してみます。

# cat <<EOF > /var/www/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
test
</body>
</html>
EOF


f:id:akiyoko:20150524183158p:plain

index.html が表示されるようになりました。





 

2. ELB に自己署名証明書をインストールする場合

今度は、EC2インスタンスではなく、ELB に SSL証明書をインストールしてみます。

HTTPS通信は ELB で HTTP に変換されるようにするため、EC2側では SSL は処理しません。

公式ドキュメントのが非常に参考になります。


なお、ELBで SSL証明書を使う場合には、秘密鍵にパスフレーズを付けてはいけません。秘密鍵からパスフレーズを除去する方法もありますので、適宜ググりましょう。


 

1) EC2インスタンス作成

EC2インスタンスを起動します。

Region: Tokyo
VPC: T1 (10.0.0.0/16)
Subnet: T1-Public #1 (10.0.0.0/24)
SG: T1-Web (22, 80番を許可)
EC2: T1-Web #1 (Amazon Linux AMI)


Security Group の許容ポートに「443」を入れないこと以外は、1. の場合と同じです。

f:id:akiyoko:20150524190724p:plain

f:id:akiyoko:20150524190734p:plain

f:id:akiyoko:20150524190744p:plain

f:id:akiyoko:20150524190757p:plain

2) Apache のインストール

EC2側では SSL は処理しないので、mod_ssl はインストールしません。

$ chmod 600 ~/Downloads/T1-key.pem
$ ssh -i ~/Downloads/T1-key.pem ec2-user@ec2-52-68-17-41.ap-northeast-1.compute.amazonaws.com

以降は、root で操作します。

$ sudo -i
# rpm -qa | grep httpd
# rpm -qa | grep openssl
openssl-1.0.1k-1.82.amzn1.x86_64

# yum -y install httpd

# httpd -v
Server version: Apache/2.2.29 (Unix)
Server built:   Mar 12 2015 03:50:17
# openssl version
OpenSSL 1.0.1k-fips 8 Jan 2015


 

3) 秘密鍵、自己署名証明書の作成

# openssl genrsa 2048 > server.key
# openssl req -new -key server.key > server.csr
# openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt


 

4) Apache の起動

# service httpd start
Starting httpd:                                            [  OK  ]


ここで、index.html も作成しておきます。

# cat <<EOF > /var/www/html/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
test
</body>
</html>
EOF

 

5) ELB作成

SG: T1-LB (80, 443番を許可)
ELB: T1-LB (HTTPS(443) を許可)


HTTPS(443) を HTTP(80) に変換してEC2インスタンス側に転送するように設定します。
f:id:akiyoko:20150524190933p:plain
f:id:akiyoko:20150524190946p:plain

Security Group 作成時に、443番ポートを許可しておきます(80番は任意)。
f:id:akiyoko:20150524190958p:plain


[Step 3: Configure Security Settings] で、SSL証明書の情報を設定します。

Certificate Name 任意の名前(例「self-signed-certificate」)を指定します。
Private Key 下記 ①
Public Key Certificate 下記 ②
Certificate Chain 中間CA証明書は、自己署名証明書では貼り付け不要。

 

① 秘密鍵の中身を貼り付け
# openssl rsa -text < /root/server.key

で中身を表示させて、

-----BEGIN RSA PRIVATE KEY-----

から

-----END RSA PRIVATE KEY-----

までを貼り付け。

② 自己署名証明書の中身を貼り付け
# openssl x509 -text < /root/server.crt

で中身を表示させて、

-----BEGIN CERTIFICATE-----

から

-----END CERTIFICATE-----

までを貼り付け。

f:id:akiyoko:20150524191012p:plain

ヘルスチェックは、適当に値を調整。
f:id:akiyoko:20150524191340p:plain

作成した EC2インスタンスを選択します。
f:id:akiyoko:20150524191358p:plain


EC2インスタンス側の Security Group を、ELB からのリクエストに限定するように変更します。具体的には、Source に、ELB の Security Group を選択します。
f:id:akiyoko:20150524191410p:plain

f:id:akiyoko:20150524191436p:plain


EC2インスタンスのヘルスチェックが「InService」になっていることを確認。
f:id:akiyoko:20150524191456p:plain


ELBのホスト名でアクセスします。
https://T1-LB-322879575.ap-northeast-1.elb.amazonaws.com/
f:id:akiyoko:20150524191518p:plain

f:id:akiyoko:20150524191529p:plain

index.html が表示されました。