LinodeでLet'sEncryptの証明書を発行してみた

## Linodeでcertbotを使ってLet'sEncrypt証明書を発行する
殆どのWebサーバーはまだRSA証明書を使っていますが、今回はより安全だとされているECDSA証明書で発行してみます。

## LinodeでUbuntu 20.04のVMを利用
```
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"
```
## certbotの利用
Let'sEncryptの証明書を取得するために、certbotを利用します。
ubuntuのパッケージから Apache用のcertbotをインストールしてみます。
```
apt install certbot python3-certbot-apache
```
今回はecdsa証明書を用意したいので、 "--key-type ecdsa" のオプションを使いましたが、
実行したら、errorが返ってきました。　　
```
＃ certbot certonly  --key-type ecdsa -d YOUR_DOMAIN_NAME --dry-run
usage:
  certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate.
certbot: error: unrecognized arguments: --key-type ecdsa
```

エラーの原因はcertbotのバージョンが古いからでした。パッケージからインストールしたcertbotのバージョンは 0.40.0です。

```
# certbot --version
certbot 0.40.0
```
--key-type オプションは certbot 1.10.0 以上で使えるようです。以下を参照し、手動でcertbot 1.30.0 をインストールしなおしました。
https://certbot.eff.org/
(パッケージからインストールしたcertbotを削除し、snapを使って再インストールする）　

```
# certbot --version
certbot 1.30.0
```
これで準備が整ったので、 key-typeオプションで無事にLet's EncryptのECDSA証明書が発行されました。
```
certbot --key-type ecdsa -d YOUR_DOMAIN_NAME
```
### WebサイトでECDSA証明書を確認

発行されたECDSA証明書を使ってWebサイトをHTTPSで公開したあと、opensslでインターネットを経由してECDSA証明証を確認してみました。

ECDSAは"公開鍵の暗号化と署名アルゴリズム"なので、
 "Public Key Algorithm: id-ecPublicKey" になっていればECDSA証明書であることがわかります。

```
openssl s_client  -connect YOUR_DIMAIN_NAME:443 -servername YOUR_DOMAIN_NAME | openssl x509 -text

  Issuer: C=US, O=Let's Encrypt, CN=R3
        Validity
            Not Before: Sep  9 02:31:21 2022 GMT
            Not After : Dec  8 02:31:20 2022 GMT
        Subject: CN=im.linode.akamai.tech
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:ae:d8:44:19:a2:68:33:a8:d7:83:94:6c:15:50:
                    37:74:8c:04:46:b3:3d:f1:48:83:5b:33:a0:1c:dd:
                    76:8a:d4:fc:00:cb:1c:98:27:62:0e:5a:17:1a:6b:
                    d9:e8:d3:ec:26:1e:55:16:f2:3d:31:5c:f1:52:55:
                    af:32:fe:12:ae
                ASN1 OID: prime256v1
                NIST CURVE: P-256
```

最後にECDSA用の暗号スイートを使って暗号化と復号化ができているかを確認してみました。
-sigalgs オプションを使ってアルゴリズム（ECDSA+SHA256）を指定します。
```
openssl s_client  -connect YOUR_DIMAIN_NAME:443 -servername YOUR_DIMAIN_NAME -sigalgs ECDSA+SHA256 < /dev/null
```
※-sigalgs オプションはLinuxの最新バージョンのopensslでは利用できますが、macOS(monterey)のopnsslでは利用できませんでした。

 Linuxのopenssl:
```
$ openssl version
OpenSSL 1.1.1f  31 Mar 2020
```


MacOSのopenssl:
```
$ openssl version
LibreSSL 2.8.3
```
MacOSではLibreSSLになっていました。
Homebrewでopensslを確認

```
$ brew info  openssl
==> openssl@3: stable 3.0.5 (bottled) [keg-only]
Cryptography and SSL/TLS Toolkit
https://openssl.org/
/usr/local/Cellar/openssl@3/3.0.5 (6,444 files, 28.2MB)
  Poured from bottle on 2022-09-15 at 22:15:02
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/openssl@3.rb
License: Apache-2.0
==> Dependencies
Required: ca-certificates
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@3/certs

and run
  /usr/local/opt/openssl@3/bin/c_rehash

openssl@3 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.

If you need to have openssl@3 first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> /Users/bahn/.bash_profile
```
Homebrewではopenssl@3をアップデートしているものの、使っているopensslは別のパスのLibreSSLのopensslだったことがわかりました。
```
$ which openssl
/usr/bin/openssl
```


/usr/local/opt/openssl@3/bin/openssl を使ったら -sigalgs オプションが使えるようになったので、＄PATHを変えることにします。
（ちなみに　/usr/local/opt/openssl@1.1/bin/openssl も-sigalgs が使えます）

opensslのホームページ(<https://www.openssl.org/>)を確認すると、openssl3.0.5 とopenssl1.1.1qが最新でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820036/6d8ddd8d-d9a4-951c-1a97-80a490b2c378.png)

なお、LibreSSL(<https://www.libressl.org/>)の最新バージョンはLibreSSL 3.5.3 (May 18th, 2022)のようでしたが、LibreSSLをやめて本家のopensslにすることにしたので、まだ試していません。

## まとめ

Let's Encrypt証明書が簡単に発行できて驚きました。MacOSのopensslをLibreSSLから本家のopensslに変更しLinuxと同様の検証ができました。

# Linodeとは

Linode (https://www.linode.com/) は Akamaiが提供するIaaS (Infrastructure as a Service) プラットフォームプロバイダーのサービスです。リノードと発音します。
Akamaiは2022年2月にLinode社の買収を発表しました。
https://www.akamai.com/ja/newsroom/press-release/akamai-to-acquire-linode
クラウドコンピューティングをよりシンプルに、手頃な価格で、誰もが利用できるようにすることで、イノベーションを加速することができます。
https://www.linode.com/ja/alternative-cloud-provider/

## 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai