ラベル LetsEncrypt の投稿を表示しています。 すべての投稿を表示
ラベル LetsEncrypt の投稿を表示しています。 すべての投稿を表示

2025年10月26日日曜日

LetsEncrypt で 0001 や 0002 などの証明書が取得できてしまった場合の解決方法

LetsEncrypt で 0001 や 0002 などの証明書が取得できてしまった場合の解決方法

概要

前の設定が残っている状態で新規に証明書を発行すると連番が付いてしまいます
こうなると /etc/letsencrypt/live/ 配下で証明書を管理するディレクトリにも 0001 などが付き色々と面倒なので削除する方法を紹介します

なお過去に紹介した docker compose バージョンの certbot を使います

環境

  • Ubuntu 22.04
  • certbot 5.1.0

削除する

サフィックスが付いている証明書および付いていないやつも削除しましょう

  • docker compose run --rm certbot delete --cert-name your-domain.com-0001
  • docker compose run --rm certbot delete --cert-name your-domain.com-0002
  • docker compose run --rm certbot delete --cert-name your-domain.com

これで再度取得すればサフィックスなし版が取得できます
なおサフィックス版があるかないかは certificates サブコマンドを使って確認しましょう

  • docker compose run --rm certbot certificates

最後に

ホスト側の証明書をコンテナにマウントして使う場合にサフィックスがあるといろいろ面倒なのでなし版で取得するようにしましょう

参考サイト

2025年6月19日木曜日

certbot を docker compose で使う

certbot を docker compose で使う

概要

これでホスト側に certbot やら nginx をインストールしないで済みます
今回は renew でかつ webroot モードを使います

P.S あとから気づいたのですが nginx-proxy 1.7.0 であればデフォルトで .well-known/acme-challenge/ へのアクセス経路は /etc/nginx/conf.d/default.conf に定義されているので nginx/default は不要です (あっても OK)
なので proxy コンテナへの nginx/default のマウントは不要です

環境

certbot の compose.yml

certbot:
  image: certbot/certbot
  volumes:
    - /etc/letsencrypt:/etc/letsencrypt
    - /var/lib/letsencrypt:/var/lib/letsencrypt
  command: renew --non-interactive --agree-tos --webroot -w /var/lib/letsencrypt
  restart: "no"
  • 発行された証明書はホスト側の /etc/letsencrypt に保存します
  • /var/lib/letsencrypt は webroot モードで発行される acme-challenge ファイルを配置するパスです、ホスト側にも acme-challenge ファイルを渡すことで各種アプリからも acme-challenge ファイル を参照できるようにします

nginx-proxy の compose.yml

proxy:
  image: jwilder/nginx-proxy
  restart: always
  ports:
    - "80:80"
    - "443:443"
  environment:
    - SSL_POLICY=AWS-TLS-1-2-2017-01
  volumes:
    - "/var/run/docker.sock:/tmp/docker.sock:ro"
    - "/var/lib/letsencrypt:/usr/share/nginx/html:ro"
    - "/home/your_domain/nginx:/etc/nginx/vhost.d"
    - "/etc/letsencrypt/live/your_domain.com/privkey.pem:/etc/nginx/certs/your_domain.com.key"
    - "/etc/letsencrypt/live/your_domain.com/fullchain.pem:/etc/nginx/certs/your_domain.com.crt"
  • /var/lib/letsencrypt を /usr/share/nginx/html にマウントすることで nginx から acme-challenge ファイルを見えるようにします
  • /home/your_domain/nginx/default ファイルを /etc/nginx/vhost.d/default にマウントします、こうすることですべての VirtualHost の設定に対してルールが適用されます

/home/your_domain/nginx/default ファイル

location ^~ /.well-known/acme-challenge/ {
    root /usr/share/nginx/html;  # docker run 時にボリュームマウントする
    try_files $uri =404;
}
  • 各アプリの /.well-known/acme-challenge/ へのアクセスを /usr/share/nginx/html にします
  • certbot の webroot モードでは /.well-known/acme-challenge/ にアクセスが来て acme-challenge ファイルが見えれば認証 OK となります
  • 基本は 404 にしておきます

cron 設定

5 0 5,16 * * cd /home/your_domain; docker compose start certbot

定期的に certbot コンテナを実行するようにしておけば OK です

動作確認

  • docker compose up -d

or

  • docker compose start certbot

で実際にコンテナを動かせば OK です
あとは acme-challenge テキストが見れるかどうかを curl などでテストしておいてもいいかもです

  • docker compose run --rm --entrypoint="" certbot mkdir -p /var/lib/letsencrypt/.well-known/acme-challenge
  • docker compose run --rm --entrypoint="" certbot touch /var/lib/letsencrypt/.well-known/acme-challenge/test.txt
  • docker compose exec proxy cat /usr/share/nginx/html/.well-known/acme-challenge/test.txt
  • curl http://your-domain.com/.well-known/acme-challenge/test

最後に

certbot をコンテナで実行し証明書を更新する方法を紹介しました
これでホスト側で certbot をインストールしたりする必要がなくなります
初回時のみ以下のように certonly する必要があるので注意しましょう

docker compose run --rm certbot \
  certonly --webroot -w /var/lib/letsencrypt \
  -d your_domain.com \
  -d www1.your_domain.com \
  --email your@email.com \
  --agree-tos --non-interactive

またモード (nginx など) によってやり方がだいぶ変わるのでその辺りも注意してください
今回紹介したのは webroot モードといって既存のアプリを使って ACME チャレンジする方式となっています

参考サイト

2025年5月18日日曜日

docker registry で Let's Encrypt の証明書を使って SSL 通信する方法

docker registry で Let's Encrypt の証明書を使って SSL 通信する方法

概要

わざわざ insecure-registries に記載するのが面倒なので証明書がある場合は SSL 化しましょう

環境

  • Ubuntu 22.04
  • docker registry 2.8.3
  • docker 27.0.3

auth_config.yml

server:
  addr: ":5000"
  certificate: "/certs/fullchain.pem"
  key: "/certs/privkey.pem"

pem ファイルは Let’s Encrypt で取得したものをそのまま利用します

compose.yml

services:
  registry:
    image: registry:2
    ports:
      - "5000:5000"
    volumes:
      - "/path/to/local/registry:/var/lib/registry"
      - "/path/to/auth_config.yml:/config/auth_config.yml"
      - "/etc/letsencrypt/live/your.domain.com/privkey.pem:/certs/privkey.pem"
      - "/etc/letsencrypt/live/your.domain.com/fullchain.pem:/certs/fullchain.pem"
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem
      - REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem
    restart: always

ポイントはファイルを配置するだけではなくちゃんと環境変数の REGISTRY_HTTP_TLS_CERTIFICATE と REGISTRY_HTTP_TLS_KEY で配置したパスを指定する点です

起動

  • docker compose up -d

動作確認

insecure-registries なしで docker login できることを確認しましょう
もしくは

  • curl https://your.domain.com:5000/v2/_catalog

で SSL のエラーにならないことを確認しましょう

最後に

SSL を有効にした場合は逆に http が使えなくなるので注意しましょう

参考サイト

2023年2月16日木曜日

Ubuntu20.04 に certbot をインストール

Ubuntu20.04 に certbot をインストール

概要

過去の手順が少し古くなったのでそれのブラッシュアップ版になります

certbot + nginx の公式手順になります

環境

  • Ubuntu 20.04
  • certbot 1.32.2

certbot のインストール

  • sudo snap install core; sudo snap refresh core
  • sudo apt-get remove certbot
  • sudo snap install --classic certbot
  • sudo ln -s /snap/bin/certbot /usr/bin/certbot

nginx のインストール

  • sudo apt -y update
  • sudo apt -y install nginx-core

IP を A レコードに登録

たぶん必要

80ポートを Let’sEncrypt からアクセスできるようにする

これはいらない?

証明書取得

  • sudo certbot certonly --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): your.mail@address.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.
Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): your.domain.com
Requesting a certificate for your.domain.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your.domain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/your.domain.com/privkey.pem
This certificate expires on 2023-05-15.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

動作確認

  • sudo certbot certificates

削除

  • sudo certbot delete

2023年2月7日火曜日

fullchain な証明書をサーバ証明書とCA証明書に分割する方法

fullchain な証明書をサーバ証明書とCA証明書に分割する方法

概要

nginx などはサーバ証明とCA証明書 (or 中間CA証明書) を結合して配置することができます
ただミドルウェアやツールによってはサーバ証明書とCA証明書は別に分けて配置しなければいけない場合があります

そんな場合に結合されたサーバ証明書を分割する方法を紹介します

環境

  • Ubuntu 18.04
  • openssl 1.1.1 11

サーバ証明書とCA証明書の順番を確認する

コマンドで確認できます
基本的に結合されている証明書は単純に複数の証明書が文字列で順番に結合されているだけです

ただ普通に見てもそれがどの証明書かわからないので openssl コマンドで確認します

  • openssl verify -show_chain --untrusted fullchain.pem fullchain.pem

で以下のような結果になれば OK です
以下の場合は上から順番にサーバ証明書CA証明書、中間CA証明書になります

fullchain.pem: OK
Chain:
depth=0: CN = *.myserver.com (untrusted)
depth=1: C = US, O = Let's Encrypt, CN = R3 (untrusted)
depth=2: C = US, O = Internet Security Research Group, CN = ISRG Root X1

分割する

あとは fullchain.pem を分割すれば OK です   「BEGIN CERTICATE」と「END CERTIFICATE」でひとかたまりなので最初の塊を server.crt として保存しあとの 2 つの塊を ca.crt として保存すれば OK です

手動で実施しても OK ですし適当なスクリプトを作成しても OK です

気をつけなければいけないのは必ず openssl コマンドで確認した順番と証明書の種類を意識して分割してください

サーバ証明書は基本一つになりCA関連の証明書は複数あります

2021年4月16日金曜日

lego というツールを使うと dns challenge でも Let'sEncrypt の証明書が自動で取得できる

lego というツールを使うと dns challenge でも Let'sEncrypt の証明書が自動で取得できる

概要

Let’sEncrypt で dns challenge を使った場合 TXT レコードの登録が必要になります
DNS サービスに API などがある場合は prehook や posthook を使って自動化することができます
自分で作るのが面倒な場合は golang 製の lego というツールを使うと楽に dns challenge で証明書を取得できることがあります

環境

  • docker 19.03.6
  • lego 4.3.1

コマンド例

  • mkdir lego
docker run --rm \
-e NIFCLOUD_ACCESS_KEY_ID=xxxx \
-e NIFCLOUD_SECRET_ACCESS_KEY=xxxx \
-v $(pwd)/lego:/lego goacme/lego \
--path /lego \
--email your-name@mail.domain \
--dns nifcloud \
--domains *.my-domain.example.com \
--accept-tos \
run

--email, --domains は必須のオプションになります
--accept-tos で確認の入力を省略することができます
path で証明書が保存されるパスを指定できるのでそのパスをホスト側のディレクトリでバインドしてあげましょう
あとはプロバイダに応じた設定を行います

提供されている Provider

かなりたくさんあります
https://github.com/go-acme/lego/tree/master/providers/dns

引数の --dns にプロバイダを指定することができます
route53 や clouddns などのメジャーな DNS サービスがある他さまざまな DNS サービスが対応しているようです
プロバイダによって設定するべき環境変数がことなるので詳細は

  • docker run --rm goacme/lego dnshelp -c route53

などで確認することができます

2021年4月15日木曜日

certbot を docker で使う方法

certbot を docker で使う方法

概要

過去に certbot コマンドを使って Let’sEncrypt で証明書を取得しました
docker を使っても取得できるのでサンプルコマンドを紹介します
なお取得方法は dns challenge 方式で取得しています
ドメイン名やメールアドレスの部分を適宜変更して使ってください

環境

  • docker 19.03.6
  • certbot 1.14.0

取得

  • docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot certonly --manual --preferred-challenges=dns -d *.example.com -m your-name@mail.domain

一覧表示

  • docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot certificates

失効

  • docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot revoke --cert-path=/etc/letsencrypt/live/example.com/fullchain.pem

削除

  • docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot delete -d example.com

2020年11月20日金曜日

certbot renew で証明書の自動更新メモ

概要

自分用のメモです
standalone プラグインを使って証明書を取得している場合はかなり簡単に自動更新できます
--pre-hook--post-hook を使って 80 を一瞬停止するのがポイントです

環境

  • Ubuntu18.04
  • certbot 1.9.0

cron 設定

2 ヶ月に 1 回 24:30 に更新する設定です
Lets’s Encrypt は 90 日で期限切れで残り 30 日から更新可能です

80 番はコンテナで動作しているので docker コマンドで停止しています
ここは自身の環境にあったコマンドに変更すれば OK です

30 15 25 */2 * cd /home/hawksnowlog/app; sudo certbot-auto renew --pre-hook "docker-compose stop proxy" --post-hook "docker-compose start proxy"

他にファイアウォールなどで 80 番ポートを制御している場合はそれも一瞬開放する必要があります

2020年9月10日木曜日

certbot の standalone プラグインで証明書を取得する

概要

DNS を使った manual プラグインでの取得方法を過去に紹介しました
今回は standalone プラグインを使った方法を紹介します
standalone プラグインは DNS ではなく HTTP/80 ポートを使って証明書の取得を行います

環境

  • Ubuntu18.04
  • certbot 1.7.0

事前準備: A レコードを登録する

取得するドメイン or サブドメインの A レコードを DNS に登録しましょう
standalone プラグインは証明書取得時に指定したドメインの 80 番ポートにアクセスするため DNS で引けることが必須条件になります

certbot-auto インストール

  • cd /usr/local/bin
  • sudo git clone https://github.com/certbot/certbot.git
  • sudo ln -s /usr/local/bin/certbot/certbot-auto /usr/local/bin/

HTTP/80 ポートを停止

Nginx なり Apache Httpd なりですでに 80 番ポートを LISTEN している場合は停止しましょう
docker の場合はコンテナを停止しておきます

  • docker-compose stop proxy

証明書取得

では証明書を取得します
今回はインタラクティブモードで取得します

  • sudo certbot-auto certonly --standalone -t

メールアドレスと取得する証明書のドメインを入力します
問題なければ証明書が取得できます
取得後に証明書が配置されるパスは /etc/letsencrypt/live/domain.name になります
fullchain.pemprivkey.pem がシンボリックされているのでこれを使います

トラブルシュート

主な原因としては以下が考えられると思います

  • Let’sEncrypt から指定のドメインの 80 番ポートにアクセスできない
    • ファイアウォールの設定を見直しましょう
  • A レコードが引けない
    • 少し待ってから再度実施しましょう
    • dig コマンドなどで A レコードが引けるか確認しましょう

HTTP/80 ポートの再起動

止めていた Nginx や httpd を再起動しましょう

  • docker-compose start proxy

もし証明書のパスが変わって docker-compose.yml などを書き換えた場合はコンテナを再作成しましょう

  • docker-compose rm proxy
  • docker-compose create proxy
  • docker-compose start proxy

Tips: 古い証明書の削除

今回は standalone プラグインを使って新規で証明書を作成しました
もし manual プラグインを使って別環境で同一ドメインの証明書を取得していた場合は manual プラグイン側の証明書はもう使わないので削除しましょう

  • sudo certbot-auto delete --cert-name domain.name

Let’sEncrypt はすでに同一ドメインで証明書を発行していても別プラグインを使えば取得できてしまいます
なので一時的に同一ドメインの複数証明書ができてしまいます
管理用のメールアドレスなども同一のものが使えてしまうので混乱しないように使わなくなったプラグイン側の証明書は削除しておきましょう

このあとは自動更新をする

基本は renew コマンドで OK です

  • sudo certbot-auto renew

証明書を新規で作成したばかりだと証明書の更新の必要がないというエラーになるので更新できません
また standalone プラグインを使った更新は結局 80 番ポートの停止が必要なので renew 前に同じように停止し更新後に再起動が必要になります

自動更新の方法はまた別記事でまとめる予定ですが --pre-hook--post-hook オプションを使って自動更新することになると思います

最後に

certbot の standalone プラグインを使って証明書の取得を行ってみました
一瞬 http が止まるので 80 番ポートで動作しているサービスの場合は前に紹介した manual プラグインや webroot プラグインを使ったほうが良いかなと思います
ただ自動更新まで考えるとやはり一番簡単なのは standalone プラグインなんじゃないかなと思います

参考サイト

2018年10月27日土曜日

Let's Encrypt で manual プラグインで作成した証明書を更新する方法

概要

証明書を一番初めに作成した際に --manual オプションを付与した場合の更新方法です
やり方は同じように証明書を取得するだけです

更新

  • sudo certbot certonly --manual --preferred-challenges=dns -d your.domain.com

--preferred-challenges=dns は DNS チャレンジの場合に付与してください
あとは指定の TXT レコードを追加するだけです

  • dig -t txt _acme-challenge.your.domain.com

でレコードが引けるまで次に進まないように注意してください

最後に

--manual + DNS チャレンジで自動更新する方法はあるのだろうか
もしやるとしたら certbot-external-auth:out-handler を使って DNS の API を使って TXT レコードを登録するスクリプトを作る感じになると思います

2018年8月11日土曜日

Mac の certbot を使って証明書を取得する (with DNS challenge)

概要

過去に Ubuntu で証明書を取得してみました
今回は Mac の certbot を使って証明書を取得してみました
また、認証の方式を DNS サーバを使った方式にしてみました

環境

  • macOS 10.13.6
  • certbot 0.26.1
  • DNS サービス (お名前.com のドメイン Navi 2018/08/07 時点)

certbot のインストール

  • brew install certbot

証明書発行依頼

  • sudo certbot certonly --manual --preferred-challenges=dns -d your-site-domain.com -m user1@your-site-domain.com

--manual --preferred-challenges=dns とすることで DNS のテキストレコード認証にすることができます
ドメインおよび連絡用のメールアドレスを指定して実行します

また Mac の場合 sudo 権限が必要になります

内容確認

いろいろと確認されます

  • 規約に同意する
  • メールアドレスの流用はやめていただく
  • certbot を実行しているサーバの IP のロギングを許可する

という感じです

Saving debug log to /var/log/letsencrypt/letsencrypt.log  
Plugins selected: Authenticator manual, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at              
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must                                             
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for your-site-domain.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.your-site-domain.com with the following value:

sngcfRCi5xgy_neCo6kCR4T4k-fVt_6EYdCu2v_fnhk

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

最後に表示された TXT レコードの情報を DNS サーバに登録します

DNS にテキストレコード追加

今回はお名前.com のドメイン Navi に対してテキストレコードを追加します
当然 DNS プロバイダに応じて操作内容は異なるので注意してください
やりたいことは指定のテキストレコードを指定のサブドメインで追加することです

  • ホスト名・・・_acme-challenge.your-site-domain.com
  • TYPE・・・TXT
  • VALUE・・・sngcfRCi5xgy_neCo6kCR4T4k-fVt_6EYdCu2v_fnhk

dns_challenge1.png

こんな感じで入力して追加しましょう

レコード反映確認

5 分ほど待ってレコードが問題なく引けることを確認しましょう
以下のようなコマンドを実行して結果が返ってくれば OK です

  • dig -t txt _acme-challenge.your-site-domain.com

dig の結果の一部抜粋

;; ANSWER SECTION:
_acme-challenge.your-site-domain.com. 2371 IN TXT   "sngcfRCi5xgy_neCo6kCR4T4k-fVt_6EYdCu2v_fnhk"

証明書取得

あとは Enter を押して取得するだけです
問題なくレコードが引ければ必要なファイルが /etc/letsencrypt/live/your-site-domain.com に保存されています

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/your-site-domain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/your-site-domain.com/privkey.pem
   Your cert will expire on 2018-11-06. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
  • sudo ls -1 /etc/letsencrypt/live/your-site-domain.com
README
cert.pem
chain.pem
fullchain.pem
privkey.pem

証明書の取得が完了したら DNS の設定した TXT レコードは削除してもらって大丈夫です

最後に

Mac に certbot をインストールして DNS 認証を使って証明書を取得してみました
サイトのルートディレクトリに指定のファイルを配置するよりかは簡単かなと思います

少し気になったのはメールアドレスです
DNS 認証の場合実はメールアドレスの指定は必須ではありません
今回は指定しましたが無くてもコマンドは通ります
もしかすると DNS 認証の場合指定のドメインの whois 情報から管理者のメールアドレスを算出して、そのアドレスに期限切れの連絡をしているのかもしれません
もしそうであれば whois 代行などを行っている場合は DNS プロバイダが提供するダミーのメールアドレスに連絡が行ってしまうため通知を受け取ることができません

なので今回は意図的にメールアドレスを指定しました
もしかするとそれでも通知が届かないかもしれません (指定はしたが結局 whois 側を参照している可能性があるということ)
この辺は 90 日後に期限切れになるのでわかったら追記しようかなと思います

参考サイト

2018年8月7日火曜日

ZeroSSL を使って LetsEncrypt の証明書を取得してみる

概要

ZeroSSL は自己証明書や Let's Encrypt を使って SSL 証明書を作成することができるクライアントツールです
ローカルでコマンドで使う方法もありますが今回はサイトの generator を使ってみました

環境

  • macOS 10.13.6
  • ZeroSSL (2018/08/07 時点)

事前準備

当然ですが以下は必須です

  • サーバ
  • サイトのドメイン

ない場合は適当に VPS など契約しましょう
ドメインは無料で取得することも可能です
サーバも最悪 ngrok などを使えば何とかなりますがあまりおすすめはしません

アクセス

にアクセスしましょう
Let's Encrypt を使って証明書を作成することができます

CSR を作成

まずはドメイン名から CSR を作成します
以下のような感じでドメインを入力しましょう (ドメイン名および管理者メールアドレスはダミーです)
zerossl1.png

「Include www-prefixed version too?」と聞かれた場合は SSL を張るドメインが先頭に www も含む場合は「Yes」にしましょう

「Generating CSR」でまずは CSR が作成されます
右側のテキストフィールドに CSR の情報が入力されると思います

鍵を作成する

次に CSR を元に鍵を生成します
そのまま Next を押しましょう
「Generating account key」と表示され今度は左側のテキストフィールドに鍵情報が入力されれば OK です
zerossl2.png

ちなみに生成された鍵情報をダウンロードしないと次に進めないのでダウンロードしましょう
CSR もちゃんとダウンロードしておきましょう

サイトの確認をする

次は入力したドメインのサイトが本当に自分の持ち物であるかどうかの確認を行います
次のページで表示されるテキストファイルをサイトの /.well-known/acme-challenge/ に配置しましょう
zerossl3.png

URL 的には http://your-site-name.com/.well-known/acme-challenge/rtw4i3o5v4OkyjaoRJEWYEB74vSRRD-_vOrIzZeWXfQ という感じで見えるようになれば OK です

自分はコンテナで動かしていたので以下のような感じで配置しました
とりあえず一時的に確認できればいいのでイメージにはしていません

  • docker exec container1 mkdir -p /home/public/.well-known/acme-challenge/
  • docker cp rtw4i3o5v4OkyjaoRJEWYEB74vSRRD-_vOrIzZeWXfQ container1:/home/public/.well-known/acme-challenge/

ブラウザや wget などで本当にテキストファイルが取得できるか確認しましょう
かつ ZeroSSL のサイトからもアクセスできる必要があるのでファイアウォールなどで IP の制限をしていないかなども確認しましょう

証明書の取得

問題なければ以下のようなページに取得します
一番下の方にある domain-crt.txtdomain-key.txt をダウンロードしましょう
zerossl4.png

ダウンロードしたら「DONE NEXT」を押して完了です
次のページに移動すると鍵と証明書はダウンロードできなくなるので注意してください

最後に

ZeroSSL で証明書を取得してみました
まぁそれなに簡単に取得できるたかなーと思います
が、正直コマンドラインでやったほうが簡単だったかなーと思います

今回はサイト認証を使いましたが ZeroSSL は DNS 認証もありそっちの方がテキストレコードを入れるだけなので簡単かもしれません
しかもそっちの場合はサーバが不要です

参考サイト

2018年3月31日土曜日

Ubuntu で Let's Encrypt で証明書を取得

概要

過去に CentOS で取得しました
今回は Ubuntu で取得してみました
少しやり方が変わっていので備忘録として残りしておきます

環境

  • Ubuntu 16.04
  • letsencrypt 0.4.1-1

letsencrypt コマンドのインストール

  • apt -y install nginx
  • apt -y install letsencrypt python-letsencrypt-apache

nginx はドメインが自分のものか証明するために必要になります
python-letsencrypt-apache をインストールすると apache2 もインストールされてしまうので不要であればアンインストールしてください

ファイアウォールの設定

  • ufw disable

80, 443 ポートをオープンにすれば disable にしないでも OK です
AWS などで他にファイアウォールを使って場合はそちらも 80, 443 ポートで通信できるようにしておいてください

証明書の取得

  • systemctl stop nginx

事前に nginx は停止しておきましょう
letsencrypt コマンドでサーバを立ち上げるので停止しておく必要があります

  • letsencrypt certonly --standalone -d admiral.cm-system.ga

メールアドレスを登録します
ubuntu_letsencrypt1.png

あとは規約に同意するだけです
ubuntu_letsencrypt2.png

成功すると以下のログが表示されます

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.test100-domain.ga/fullchain.pem. Your cert
   will expire on 2018-06-24. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
  • ls /etc/letsencrypt/live/www.test100-domain.ga/

で以下のファイルが作成されています

  • cert.pem -> 証明書
  • chain.pem -> 中間証明書
  • fullchain.pem -> 証明書 + 中間証明書
  • privkey.pem -> 秘密鍵

最後に

Ubuntu で Let’s Encrypt からサーバ証明書を取得してみました
かなり簡単になっていた印象です
はまりポイントは DNS の A レコードがちゃんと設定されているかどうかとサーバの 80, 443 ポートがちゃんとオープンになっているかかなと思います

あまりセキュリティ的にはよろしくないですが一瞬だけフルオープンにするのはありかなと思います

2017年4月20日木曜日

LetsEncrypt で無料で SSL 証明書を取得してみた

概要

LetsEncrypt は無料で SSL 証明書が取得できるサービスです
基本的にはドメイン認証のみになるので企業認証 (EV) などはできません
今回は専用クライアントのインストールから実際に証明書を取得してサーバにインストールするところまで行ってみます

環境

  • CentOS 7.3
  • nginx 1.10.3
  • certbot 0.12.0
  • Python 2.7.5

事前作業

事前にドメインを取得おきましょう
そして取得したいドメイン or サブドメインを DNS の A レコードとして登録して名前から IP が引けるようにしておいてください
自分は Freenom で取得したドメインを Dozens に登録することで対応しました
また、今回 SSL 証明書を取得するドメインは www.hawksnowlog.cf とします
(このドメインはすでに A レコードから削除しているためアクセスはできません)

certbot のインストール

  • yum -y install epel-release
  • yum -y install certbot python-certbot-apache

で OK です
他のプラットフォームだとインストール方法が異なるので詳細は以下をご覧ください
https://letsencrypt.jp/usage/

nginx で一旦 443 を LISTEN できるようにする

証明書を作成するのにドメインを設定したサーバの保有者であることを確認するために一旦サーバを 443 で受け付ける必要があります
自己証明書で問題ないので一旦自己証明書で 443 LISTEN 出来るように設定します

まずは自己証明書を作成します

  • mkdir /etc/nginx/cert
  • cd /etc/nginx/cert
  • openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt

次に作成した自己証明書を設定した nginx 用の ssl.conf を作成します

  • vim /etc/nginx/conf.d/ssl.conf
server {
    listen 443;

    ssl on;
    ssl_certificate      /etc/nginx/cert/cert.crt;
    ssl_certificate_key  /etc/nginx/cert/cert.key;
    ssl_session_timeout  5m;

    ssl_protocols                  SSLv2 SSLv3 TLSv1;
    ssl_ciphers                    HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers      on;

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-User $remote_user;

        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

コンテンツは何でも OK です

  • vim /usr/share/nginx/html/index.html
<html>
<head>
<title>
</title>
</head>
<body>
<p>Welcome www.hawksnowlog.cf !</p>
</body>
</html>

これで一旦 nginx を起動して 443 で LISTEN できるか確認してください

-k オプションがないと証明書で怒られると思います

certbot コマンドを使って証明書を取得する

LetsEncrypt は専用のコマンドを使って証明書を取得します
先程インストールした certbot コマンドを使います

  • certbot certonly --standalone -d www.hawksnowlog.cf

-d オプションの後は SSL 証明書を取得したいドメインを指定します
certonly サブコマンドは証明書の取得だけを行うサブコマンドです

まず実行するとメールアドレスを登録するように言われます
何でも OK ですが緊急時の連絡などが来るのでドメインの管理者のメールアドレスを登録するのが良いと思います
(以下はダミーのメールアドレスです)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):your-name@dummy.com
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

利用規約に同意します

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:A

メールアドレスを EFF に共有しても良いですか?という確認です
EFF は certbot を管理している組織です
とりあえず今回はテストなので No にしました

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N

証明書の作成が始まります
ここでドメインの 443 へのアクセスがあります
外部からアクセスできる必要があるのでファイアウォールなどの設定で 443 はオープンにしておいてください
また、ngxin も起動状態にしておきます

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for hawksnowlog.cf
tls-sni-01 challenge for www.hawksnowlog.cf
Waiting for verification...

-------------------------------------------------------------------------------
Could not bind TCP port 443 because it is already in use by another process on
this system (such as a web server). Please stop the program in question and then
try again.
-------------------------------------------------------------------------------
(R)etry/(C)ancel:R

アクセスできるとすでに 443 ポートが使われいるという旨が表示されるので一旦停止します
停止したあとで、そして Retry を入力します

すると証明書の作成が進み最終的に作成が完了します

Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.hawksnowlog.cf/fullchain.pem. Your cert
   will expire on 2017-07-18. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

作成される主な証明書は以下の通りです

  • サーバ証明書
    • /etc/letsencrypt/archive/www.hawksnowlog.cf/cert1.pem
  • 中間証明書
    • /etc/letsencrypt/archive/www.hawksnowlog.cf/chain1.pem
  • サーバ証明書+中間証明書
    • /etc/letsencrypt/archive/www.hawksnowlog.cf/fullchain1.pem
  • 秘密鍵
    • /etc/letsencrypt/archive/www.hawksnowlog.cf/privkey1.pem

また、最新版の証明書を管理するシンボリックされます
サーバから使用する場合は基本的に以下を参照しておけば常に最新版を使うことになるので以下を参照するようにしましょう

  • ls /etc/letsencrypt/live/www.hawksnowlog.cf
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

nginx の設定ファイルの書き換え

作成した LetsEncrypt の証明書を nginx に設定します

  • vim /etc/nginx/conf.d/ssl.conf
server {
    listen 443;

    ssl on;
    ssl_certificate      /etc/letsencrypt/live/www.hawksnowlog.cf/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/www.hawksnowlog.cf/privkey.pem;
    ssl_session_timeout  5m;

    ssl_protocols                  SSLv2 SSLv3 TLSv1;
    ssl_ciphers                    HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers      on;

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-User $remote_user;

        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

書き換えている箇所は ssl_certificatessl_certificate_key の部分です
nginx の場合、中間証明書を指定するディレクティブがないので証明書には合体版の証明書を使います

指定できたら再起動します

  • nginx -s stop
  • nginx

そして再度ドメインにアクセスしてみましょう
今度は証明書の警告が出ないでアクセスできるようになっていると思います

ブラウザでもアクセスしてみましょう
左上ボタンで証明書の情報を確認することができます
設定したドメインの証明書であることと LetsEncrypt が認証局になっていることを確認してください
letsencrypt1.png

また、LetsEncrypt の場合証明書の期限が 3 ヶ月になっているので更新チェックはこまめに行うようにしましょう
(自動で証明書の更新を行う方法もあるようなので、それを使うのが簡単かなと思います)
letsencrypt2.png

最後に

LetsEncrypt を使って無料で SSL 証明書を取得してみました
コマンドだけなのでハードルは高いですが、逆にエンジニア的にはコマンドだけで証明書の管理から作成、更新までできるのでかなり楽です

cerbot コマンドには他にもいろいろなオプションがあるので興味ある方はサイトで調べてみるといいと思います
日本語のドキュメントサイトもかなり丁寧に書かれているのでわかりやすいです

参考サイト

Tips

取得した証明書の確認方法

  • certbot certificates

取得した証明書の削除方法

  • certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate would you like to delete?
-------------------------------------------------------------------------------
1: www.hawksnowlog.cf
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1

-------------------------------------------------------------------------------
Deleted all files relating to certificate www.hawksnowlog.cf.
-------------------------------------------------------------------------------

現在保持している証明書の一覧が表示されるので番号を入力すれば OK です
証明書を管理しているディレクトリ (/etc/letsencrypt/archive) ごとなくなっているのが確認できると思います

LetsEncrypt はワイルドカード SSL 証明書には対応していないようです
コードサイニングの証明書としても使えないようです
その他、詳しい情報は FAQ のページに詳しく書かれています