AWS ELBにGlobalSignで取得したpfx形式のSSLファイルを設置する方法
GlobalSign(グローバルサイン)でSSL証明書を取得したところ、
メール本文には証明書+PKCS7形式の中間証明書がベタ書きで書かれてきましたが、
PKCS形式はMicrosoft IISでは簡単に利用できますが、今回はAWSのELB(ElasticLoadBalancer:ロードバランサー)に設置したいので、
結果としてメール本文は無視します。
添付ファイルで、「CEDS*********.zip」というファイルが付いてきているので、こちらを使います。
解凍パスワードが必要になるので、別で連絡のあるパスワードを使って展開してください。
すると、「CEDS*********.pfx」というファイルが入っています。
通常ですと、秘密鍵、証明書、中間証明書などが入っている事を期待するのですが、pfxという1ファイルだけです。
これをAWSのELBに設置していこうと思います。
準備するもの
クライアントはWindowsでもMacでも大丈夫ですが、opensslコマンドを使えるようにしたりと環境設定を省略する為、
既にopenssl等が導入してあるCentOSのサーバにsshで接続して作業を行いました。
・クライアント(今回はCentOSの入った別のサーバから設置を行います。)
・CEDS*********.pfx(先ほど展開してできたファイル)
・申込時に指定したパスワード
・AWSのアカウント
pfx形式ファイルの変換
SFTP等で、適当なディレクトリにpfxファイルを転送してから作業を行います。
今回は、/home/test/ディレクトリに予め転送しておきます。
[root@test ~]# openssl pkcs12 -in CEDS*********.pfx -nocerts -nodes -out server.key←秘密鍵への変換 Enter Import Password:←パスフレーズ入力 [root@test ~]# openssl pkcs12 -in CEDS*********.pfx -clcerts -nodes -out server.crt←証明書への変換 Enter Import Password:←パスフレーズ入力 [root@test ~]# openssl pkcs12 -in CEDS*********.pfx -cacerts -nokeys -out server.ca-bundle←中間証明書への変換 Enter Import Password:←パスフレーズ入力
証明書の下準備
AWSでは、秘密鍵はパスフレーズが付いたままだとエラーが出るので、パスフレーズを削除します。
また、証明書と中間証明書は、SHA256とSHA1が1ファイルに両方記載されているので、必要な部分のみを抜き出します。
[root@test ~]# openssl rsa -in server.key -out server_nopass.key←秘密鍵のパスワードを外して、server_nopass.keyというファイルで保存します [root@test ~]# cp server.crt server.crt.bak←証明書のバックアップを取ります。 [root@test ~]# cp server.ca-bundle server.ca-bundle.bak←中間証明書のバックアップを取ります。 [root@test ~]# vi server.crt←証明書の編集 半分より下の -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- だけを残して他を削除します。 [root@test ~]# vi server.ca-bundle←中間証明書の編集 半分より上のの -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- だけを残して他を削除します。
残す部分が証明書と中間証明書で上と下が逆なので注意してください。
AWSコンソールからIAM を作成しアカウントを作成する
awsコマンドを利用する為に、コンソールからIAM(Identity & Access Management)を作成します。
コンソールからIdentity & Access Managementを選択します。
ユーザーを選択します。
新規ユーザーの作成をクリックします。
ユーザー名を入力して、「ユーザーごとにアクセスキーを生成」にチェックを入れて作成ボタンをクリックします。
ユーザーが作成されると、下記のような画面になるので、必ず認証情報のダウンロードを行って下さい。
すると、credentials.csvという名称で下記のようなCSVファイルがダウンロードされますので、こちらを安全な場所に保管しておいてください。
User Name,Access Key Id,Secret Access Key "test@aws",AKIAIOSFODNN7EXAMPLE,wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
閉じるを押すと、ユーザが作成されています。
左ペインからポリシーを選択します。
SSLの設置にはIAMFullAccessが必要なので選択して、ポリシーアクションからアタッチをクリックします。
先ほど作成したユーザーを選択して、ポリシーのアタッチをクリックします。
これでアカウントの作成が完了しました。
AWSのトラップ
AWSのコンソール→EC2→ロードバランサー→リスナー→SSL証明書(変更)→AWS Identity and Access Management (IAM) に、新規のSSL 証明書をアップロードする
に下記のような画面があり、あとはそこに貼り付けるだけ・・・と思わせておいて、
ここからは設定できません
登録するとエラーになります。
エラーになるのに、証明書の名前は登録されてしまうので、とてもたちが悪いです。
もし、登録してしまった場合は後々ハマる箇所があるので、そちらは後述します。
AWS コマンドラインインターフェイス(AWS CLI)のインストール
結果として、AWSの管理画面から新規のSSL証明書を追加してそれをELBに適用できるようになってはいるが、コマンドラインからでないとできないというトラップが仕組まれています。
AWS CLIとは、コマンドラインでAWS サービスを管理するための統合ツールです。
なので、AWS CLIをインストールします。
AWS CLIはPythonが必要でpipをインストールしてからAWS CLIをインストールします。
AWS CLI のインストールと設定にも方法が記載されていますが下記にまとめます。
[root@test]# curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"←pipをダウンロードします。 [root@test]# python get-pip.py←pipをインストールします。 [root@test]# pip install awscli←AWS CLIをインストールします。
これでawsコマンドが利用可能になりました。
AWS CLI の設定
awsコマンドが利用できるようになったので、アカウント作成時にダウンロードした、Access Key Id と Secret Access Keyを使ってAWS CLIのセットアップをします。
こちらも公式にAWS CLIの設定が記載されていますが下記にまとめます。
[root@test]# aws configure←aws configure実行 AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE←Access Key Idを入力 AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY←Secret Access Keyを入力 Default region name [None]: ap-northeast-1←どこでも良いが、日本ならap-northeast-1で良い Default output format [None]: json←結果の返し方を"text","JSON","table"のどれかを指定(とりあえずjsonで良い)
これで設定が完了しました。
~/.aws/というディレクトリが作成されています。
その中の、「credentials」「config」に設定した内容が記載されていますので、変更したい時はviで編集可能です。
証明書のアップロード
先ほど証明書を作成したディレクトリに移動して、アップロードを行います。
[root@test]# cd ~←証明書を作成したディレクトリに移動 [root@test ~]# aws iam upload-server-certificate --server-certificate-name My_CertName_2016 --certificate-body file://server.crt --private-key file://server_nopass.key --certificate-chain file://server.ca-bundle←赤字の最初は証明書を管理する名称(更新があるので、年を入れたりした方が良い)、その後は順に、証明書、中間証明書、秘密鍵の順になっています。 ←成功すると以下のようなjsonが返ってきます。 { "ServerCertificateMetadata": { "ServerCertificateId": "xxxxxxxxxxxxxxxxxxx", "ServerCertificateName": "My_CertName_2016", "Expiration": "2017-01-25T00:05:09Z", "Path": "/", "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxx:server-certificate/My_CertName_2016", "UploadDate": "2016-06-22T04:41:23.191Z" } }
先ほどのトラップに引っかかってしまい、既にファイル名が作成されていると下記のようなエラーが表示されます。
An error occurred (EntityAlreadyExists) when calling the UploadServerCertificate operation: The Server Certificate with name My_CertName_2016 already exists.
このような場合は、既存の証明書を確認して削除します。
[root@test]# aws iam list-server-certificates←既存の証明書の確認 { "ServerCertificateMetadataList": [ { "ServerCertificateId": "xxxxxxxxxxxxxxxxxxx", "ServerCertificateName": "My_CertName_2014", "Expiration": "2015-06-24T05:03:30Z", "Path": "/", "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxx:server-certificate/My_CertName_2014", "UploadDate": "2014-07-16T12:30:45Z" }, { "ServerCertificateId": "xxxxxxxxxxxxxxxxxxx", "ServerCertificateName": "My_CertName_2015", "Expiration": "2016-06-25T00:05:09Z", "Path": "/", "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxx:server-certificate/My_CertName_2015", "UploadDate": "2015-06-25T00:18:17Z" }, { "ServerCertificateId": "xxxxxxxxxxxxxxxxxxx", "ServerCertificateName": "My_CertName_2016",←既にある "Expiration": "2017-01-25T00:05:09Z", "Path": "/", "Arn": "arn:aws:iam::xxxxxxxxxxxxxxxxxxx:server-certificate/My_CertName_2016", "UploadDate": "2016-06-22T03:15:13Z" } ] } [root@test]# aws iam delete-server-certificate --server-certificate-name My_CertName_2016←My_CertName_2016を削除
これで再度作成してみます。
設置
正常にアップロードが完了したら、AWSコンソールから設置を行います。
AWSのコンソール→EC2→ロードバランサー→リスナー→SSL証明書(変更)→AWS Identity and Access Management (IAM) から、既存の証明書を選択するから、「修了書:」のプルダウンにアップロードした証明書が表示されているので、そちらを選択して、保存を押します。
ブラウザで表示させて、確認してください。