Dockerの開発環境を自己証明書でSSL対応する

前提

  • Dockerイメージにはphp-apacheを使用

ディレクトリ構成

.
├── docker/
│   ├── Dockerfile
│   ├── apache2/
│   │   └── sites-available/
│   └── ssl/
└── docker-compose.yml

証明書の作成

作成前に秘密鍵たちを格納しておくディレクトリを作っておく

$ mkdir docker/ssl
$ cd docker/ssl

1. 秘密鍵の作成

$ openssl genrsa -out server.key 2048

2. CSRファイルの作成

Common Namelocalhostを指定、それ以外はEnterでOK

$ openssl req -new -sha256 -key server.key -out server.csr

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) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:localhost
Email Address []:

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

3. 証明書の作成1

$ echo "subjectAltName = DNS:localhost" > server.txt
$ openssl x509 -req -sha256 -days 3650 -signkey server.key -in server.csr -out server.crt -extfile server.txt

証明書作成後はserver.txtは削除してOK

4. default-ssl.confファイルのコピーとマウント

dockerのコンテナに入ってdefault-ssl.confをコピーする

$ docker exec -it container-name bash
$ cp /etc/apache2/sites-available/default-ssl.conf docker/apache2/sites-available/

5. default-ssl.confの修正

- SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
- SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
+ SSLCertificateFile    /etc/ssl/certs/server.crt
+ SSLCertificateKeyFile /etc/ssl/private/server.key

6. docker-comose.ymlの修正

  # 省略
  web:
    # 省略
    volumes:
      # 省略
      - ./docker/apache2/sites-available/default-ssl.conf:/etc/apache2/sites-available/default-ssl.conf # 追加
      - ./docker/ssl/server.crt:/etc/ssl/certs/server.crt # 追加
      - ./docker/ssl/server.key:/etc/ssl/private/server.key # 追加
    ports:
      - {http通信で使いたいport番号}:80
      - {https通信で使いたいport番号}:443 # 追加
# 省略    

7. Dockerfileでsslを有効にする

# 省略
RUN a2enmod ssl && a2ensite default-ssl
# 省略

buildし直してhttpsで接続できればOK

$ docker-compose build --no-cache && docker-compose up -d

参考

qiita.com


株式会社エイルシステムではWebエンジニア・モバイルアプリエンジニアを募集しています。
実務経験がなくてもOKです。ご興味のある方は弊社HPよりご連絡ください。



  1. 10年で作成しています。