Let’s Encrypt (dehydrated) を使ってECDSAでSSL化した手順

こんにちは。hacknoteのr.katoです。

今回はdehydratedを使って、暗号形式がECDSAの鍵を設定した手順を紹介していきます。

環境

  • Amazon Linux2(ドメイン取得、設定済み)
  • Apache2.4.39
  • openssl 1.0.2k-fips

手順

  1. dehydratedの入手

次のコマンドを実行してください。
dehydratedを使って鍵の作成や認証局への申請を行います。

$ cd /opt
$ git clone https://github.com/lukas2511/dehydrated.git
$ mkdir -p /var/www/dehydrated/
  1. Apacheの設定

次の様にapp.confを作成してください。

# /etc/httpd/conf.d/app.conf 

Alias /.well-known/acme-challenge /var/www/dehydrated

<Directory /var/www/dehydrated>
        Options None
        AllowOverride None

        # Apache 2.4
        <IfModule mod_authz_core.c>
                Require all granted
        </IfModule>
</Directory>

そして、Webサーバーの再起動をしてください。

  1. dehydratedの設定

認証局の規約に同意してからdehydratedの設定をしていきます。
次のコマンドでconfigファイルの例をopt/dehydrated/にコピーし、その後規約に同意します。

$ cp /opt/dehydrated/docs/examples/config /opt/dehydrated/
$ ./dehydrated --register --accept-terms

そして、/opt/dehydrated/configを編集します。

# /opt/dehydrated/config

(略)
# Resolve names to addresses of IP version only. (curl)
# supported values: 4, 6
# default: <unset>
IP_VERSION="4"

# Path to certificate authority (default: https://acme-v02.api.letsencrypt.org/directory)
CA="https://acme-v02.api.letsencrypt.org/directory"

(略)

# File containing the list of domains to request certificates for (default: $BASEDIR/domains.txt)
DOMAINS_TXT="${BASEDIR}/domains.txt"

# Output directory for challenge-tokens to be served by webserver or deployed in HOOK (default: /var/www/dehydrated)
WELLKNOWN="/var/www/dehydrated"

# Default keysize for private keys (default: 4096)
KEYSIZE="521"  #今回は521にしたが必要に応じて変更

(略)

# Which public key algorithm should be used? Supported: rsa, prime256v1 and secp384r1
KEY_ALGO=prime256v1
(略)

その後、ドメインを指定するため、/opt/dehydrated/domains.txtを作成し、
設定したいドメインをdomains.txtに入力し保存します。
ここでは、仮にexample.comを設定したいドメインとします。

  1. テスト

ここまで設定したら、一度テストします。
認証局に申請しすぎると、Banされるのでテストを行います。

次のコマンドでテストができます。

$ ./dehydrated -c -d example.com

うまくいけば次の様に出力されます。

# INFO: Using main config file /opt/dehydrated/config
Processing example.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting new certificate order from CA...
 + Received 1 authorizations URLs from the CA
 + Handling authorization for example.com
 + 1 pending challenge(s)
 + Deploying challenge tokens...
 + Responding to challenge for example.com authorization...
 + Challenge is valid!
 + Cleaning challenge tokens...
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!
  1. テストができたら、発行します。次のコマンドを実行してください。
$ ./dehydrated -c -x -d example.com

正常終了すると次のファイルが生成されるので、Apacheに設定します。

  • サーバー証明書: /opt/dehydrated/certs/example.com/cert.pem
  • CA証明書: /opt/dehydrated/certs/example.com/chain.pem
  • 秘密鍵: /opt/dehydrated/certs/example.com/privkey.pem
  • CA証明書 + サーバー証明書:/opt/dehydrated/certs/example.com/fullchain.pem
  1. 鍵の設定

/etc/httpd/conf.d/ssl.confの作成をし、次の様にします。

LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

SSLOpenSSLConfCmd ECDHParameters prime256v1
SSLOpenSSLConfCmd Curves prime256v1

<VirtualHost *:443>
    LogLevel warn
    SSLCertificateFile /opt/dehydrated/certs/example.com/cert.pem
    SSLCertificateKeyFile /opt/dehydrated/certs/example.com/privkey.pem
    SSLCertificateChainFile /opt/dehydrated/certs/example.com/chain.pem


    DocumentRoot "/var/www/html/"
    ServerName example.com:443

</VirtualHost>

以上でこの様にECDSA化することができます。