西暦9999年まで使えるSSL証明書を作った話

西暦9999年まで使えるSSL証明書を作った話

はじめに

うちのサーバ、結構、不正アクセスとまでは言わないけど、ちょいちょいSPAMじみたアクセスが来るんですよね。
IPアドレス直打ちしてディレクトリを捜索するみたいなの。

そういうのちょっとうざったいので、nginxの444で追い返すんですけど、なんとなく、SSLにちゃんと対応してみようかないう、面白半分で作った代物です。
基本的に、使い道なんてないし、こんなことに時間かけるくらいなら他の事に時間かけたほうがいいっていう、しょうもないネタです。

また、今回作るのは言わずもがな「オレオレ証明書」と呼ばれるもので、かつ、わざと情報が欠落したものを生成しています。
ちゃんと使える証明書を作りたい方は、「certbotでLet's EncryptなSSL証明書を取得する例」をご参照ください。

certbotでLet’s EncryptなSSL証明書を取得する例
ちょくちょく使うんだけど、いつもよく何をしたらいいんだっけってな感じに、忘れるので、certbotでLet’s EncryptなSSL証明書を取得するときのためのおぼえがき。

TL; DR, 出来上がるのは要するにこんなの

別に使ってもらって構わないのだけれども、他人の作ったカギを使うのはどうなんだって気はしないでもないので、一応、作った方がいい気はするよとだけ。
ファイルに2行書いて、コマンド2本流すだけなので、別に大して難しくないですし。

dummy.key

-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----

dummy.crt

-----BEGIN CERTIFICATE-----
MIIDvzCCAiegAwIBAgIUEyuoD7ir3RFRJUIrqWaNbrCYP94wDQYJKoZIhvcNAQEL
BQAwADAgFw03MDAxMDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowADCCAaIwDQYJ
KoZIhvcNAQEBBQADggGPADCCAYoCggGBAMpbZvzVYj9hNjCRIFDfUOgeET59FW4P
Rb0OlGexHfPV3i9zW20QhVxEY7rk5vRhydbzdtia8g/xoBZUD+j2+6d3ELa4xB+a
N91orRiuvgX3zeWGyvimbZ8Te61PKuXHm4OYJTphIdp+oVtFYfBL4oZ5XXLqEGMN
UfSZ+SfFkkqnxA6D20fGBe0MGUgAwEr4p5PDwfIXbid/h8HCBszYco83/7iPauqj
coMu54rQFSRaaNe0BVHZaQQ4/wOU7bHAJRWx+9zS1ixJS2w6uNgIeeakF/UHHl+D
fpDV2YKPIKs70+JDzNPMLQBmpgNo/tMfGFsk99wyOJc29v9odV15uLEIifVNKjHF
KCLjz5AYUNKcFatV73XrLqGQvq38odI6TAROquKGe+ayuzxQzaMVnwm7BQ0v9W1K
QsksKh3TMlLQ9deacjfWp+LnEDc3Hq3A90qBmfOhMviQWVwf0P8LAwSgwX3yGq0D
4XI/twqyj9OwQssPh46Xs3zZIBIbLggOGQIDAQABoy8wLTAMBgNVHRMBAf8EAjAA
MB0GA1UdDgQWBBSF5OJ5M9Z+FLOj/dYwdj0bCom5QjANBgkqhkiG9w0BAQsFAAOC
AYEAZinpDaaqWUUx4YLPVJEsWWhz0luQAp+XqIgcLGXuqp4MQKPwJnqJB/pEcP1T
WzTk6Q+/Uilg2TWygZnC+UOdFE+5MeUlDeXmkrqtdWaS+VczMPLYa4mpl70tuYvI
SY8ggVCwmljU0YHGjIoiNWxYDF18RLgBQWNMi8baFuFMIF/RU+wDLl3j1w1HWu2v
6YknY4TkN8Gn//yRxA6Qi1fyyLYhkYCbPqRBIMgOGt/MFgmgI2v0k7dpaqj+5AkA
vE9tq1Rfws/MbctYE0qdNuHOx9MUw1yd0lck2TDRvfc2kPnlB0zEaPR5ZJWYQprb
W7k9pbjkK6h0JKZzEg2zC7saMeIVVE7cbJ6gxvBqZ1+iERQfRBqjq42VThcm3NZU
PsdpKjha/mU1sxOiFXJpflsEa2OywRTBqrEyxlTWCZaSwJwxxvIcj1I2uRWy8uoq
kgP0Don3Ygm1XYV05Lo9oD4IWwA0TTazEdiZRyp1vOSxeUpVHsTwyh/ubNMMJorN
7pdG
-----END CERTIFICATE-----

(確認)

$ openssl x509 -text -fingerprint -noout -in dummy.crt
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            13:2b:a8:0f:b8:ab:dd:11:51:25:42:2b:a9:66:8d:6e:b0:98:3f:de
        Signature Algorithm: sha256WithRSAEncryption
        Issuer:
        Validity
            Not Before: Jan  1 00:00:00 1970 GMT
            Not After : Dec 31 23:59:59 9999 GMT
        Subject:
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (3072 bit)
                Modulus:
                    00:ca:5b:66:fc:d5:62:3f:61:36:30:91:20:50:df:
                    50:e8:1e:11:3e:7d:15:6e:0f:45:bd:0e:94:67:b1:
                    1d:f3:d5:de:2f:73:5b:6d:10:85:5c:44:63:ba:e4:
                    e6:f4:61:c9:d6:f3:76:d8:9a:f2:0f:f1:a0:16:54:
                    0f:e8:f6:fb:a7:77:10:b6:b8:c4:1f:9a:37:dd:68:
                    ad:18:ae:be:05:f7:cd:e5:86:ca:f8:a6:6d:9f:13:
                    7b:ad:4f:2a:e5:c7:9b:83:98:25:3a:61:21:da:7e:
                    a1:5b:45:61:f0:4b:e2:86:79:5d:72:ea:10:63:0d:
                    51:f4:99:f9:27:c5:92:4a:a7:c4:0e:83:db:47:c6:
                    05:ed:0c:19:48:00:c0:4a:f8:a7:93:c3:c1:f2:17:
                    6e:27:7f:87:c1:c2:06:cc:d8:72:8f:37:ff:b8:8f:
                    6a:ea:a3:72:83:2e:e7:8a:d0:15:24:5a:68:d7:b4:
                    05:51:d9:69:04:38:ff:03:94:ed:b1:c0:25:15:b1:
                    fb:dc:d2:d6:2c:49:4b:6c:3a:b8:d8:08:79:e6:a4:
                    17:f5:07:1e:5f:83:7e:90:d5:d9:82:8f:20:ab:3b:
                    d3:e2:43:cc:d3:cc:2d:00:66:a6:03:68:fe:d3:1f:
                    18:5b:24:f7:dc:32:38:97:36:f6:ff:68:75:5d:79:
                    b8:b1:08:89:f5:4d:2a:31:c5:28:22:e3:cf:90:18:
                    50:d2:9c:15:ab:55:ef:75:eb:2e:a1:90:be:ad:fc:
                    a1:d2:3a:4c:04:4e:aa:e2:86:7b:e6:b2:bb:3c:50:
                    cd:a3:15:9f:09:bb:05:0d:2f:f5:6d:4a:42:c9:2c:
                    2a:1d:d3:32:52:d0:f5:d7:9a:72:37:d6:a7:e2:e7:
                    10:37:37:1e:ad:c0:f7:4a:81:99:f3:a1:32:f8:90:
                    59:5c:1f:d0:ff:0b:03:04:a0:c1:7d:f2:1a:ad:03:
                    e1:72:3f:b7:0a:b2:8f:d3:b0:42:cb:0f:87:8e:97:
                    b3:7c:d9:20:12:1b:2e:08:0e:19
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Subject Key Identifier:
                85:E4:E2:79:33:D6:7E:14:B3:A3:FD:D6:30:76:3D:1B:0A:89:B9:42
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        66:29:e9:0d:a6:aa:59:45:31:e1:82:cf:54:91:2c:59:68:73:
        d2:5b:90:02:9f:97:a8:88:1c:2c:65:ee:aa:9e:0c:40:a3:f0:
        26:7a:89:07:fa:44:70:fd:53:5b:34:e4:e9:0f:bf:52:29:60:
        d9:35:b2:81:99:c2:f9:43:9d:14:4f:b9:31:e5:25:0d:e5:e6:
        92:ba:ad:75:66:92:f9:57:33:30:f2:d8:6b:89:a9:97:bd:2d:
        b9:8b:c8:49:8f:20:81:50:b0:9a:58:d4:d1:81:c6:8c:8a:22:
        35:6c:58:0c:5d:7c:44:b8:01:41:63:4c:8b:c6:da:16:e1:4c:
        20:5f:d1:53:ec:03:2e:5d:e3:d7:0d:47:5a:ed:af:e9:89:27:
        63:84:e4:37:c1:a7:ff:fc:91:c4:0e:90:8b:57:f2:c8:b6:21:
        91:80:9b:3e:a4:41:20:c8:0e:1a:df:cc:16:09:a0:23:6b:f4:
        93:b7:69:6a:a8:fe:e4:09:00:bc:4f:6d:ab:54:5f:c2:cf:cc:
        6d:cb:58:13:4a:9d:36:e1:ce:c7:d3:14:c3:5c:9d:d2:57:24:
        d9:30:d1:bd:f7:36:90:f9:e5:07:4c:c4:68:f4:79:64:95:98:
        42:9a:db:5b:b9:3d:a5:b8:e4:2b:a8:74:24:a6:73:12:0d:b3:
        0b:bb:1a:31:e2:15:54:4e:dc:6c:9e:a0:c6:f0:6a:67:5f:a2:
        11:14:1f:44:1a:a3:ab:8d:95:4e:17:26:dc:d6:54:3e:c7:69:
        2a:38:5a:fe:65:35:b3:13:a2:15:72:69:7e:5b:04:6b:63:b2:
        c1:14:c1:aa:b1:32:c6:54:d6:09:96:92:c0:9c:31:c6:f2:1c:
        8f:52:36:b9:15:b2:f2:ea:2a:92:03:f4:0e:89:f7:62:09:b5:
        5d:85:74:e4:ba:3d:a0:3e:08:5b:00:34:4d:36:b3:11:d8:99:
        47:2a:75:bc:e4:b1:79:4a:55:1e:c4:f0:ca:1f:ee:6c:d3:0c:
        26:8a:cd:ee:97:46
SHA1 Fingerprint=92:09:79:AC:24:09:72:C9:67:21:F7:00:65:F2:F3:76:A7:72:A3:7C

準備

証明書の発行ってのは、OpenSSLでも作れるのはそうなんだけど、わたしの知る限りOpenSSLじゃ現時刻以前から有効な証明書ってのは作れない。 -startdateってなオプションがあるけど、これは表示方面でしか使えなかった気がする。

ということで、GunTLSというサートツールをさーっと導入しましょう。

$ sudo apt-get install gnutls-bin

$ certtool --version
certtool 3.8.3

この記事の執筆時点では、バージョンが3.8.3でした。

作業ディレクトリも用意しましょう。
別にどこでもいいのですが、とりあえず、nginxで使うので /etc/nginxにてきとうな名前でディレクトリを掘りますか。
とりあえず_dummyという名前でディレクトリを作りました。Apacheの人はてきとうに読み替えてください。

$ sudo mkdir /etc/nginx/_dummy -p
$ cd /etc/nginx/_dummy

ついでに、後ほど使うコンフィグファイルを準備しておきます。

$ sudo vim dummy.cfg

で新しいファイルを生成して、下記のように書きましょう。
上段は、「いつから?」の情報。下段が「いつまで?」の情報です。
とりあえず、UnixTimeの0から、限界値っぽい時間までを入れています。適宜必要に応じて変更してもよろしいかと思います。

activation_date="1970-01-01 00:00:00 +0000"
expiration_date="9999-12-31 23:59:59 +0000"

証明書の生成

証明書を作っていきましょう。

繰り返しにはなりますが。これから作るものは言わずもがな、いわゆる「オレオレ証明書」なので、まともに使えるものではないです。
まともなカギが欲しい人は「certbotでLet's EncryptなSSL証明書を取得する例」をご参照ください。

certbotでLet’s EncryptなSSL証明書を取得する例
ちょくちょく使うんだけど、いつもよく何をしたらいいんだっけってな感じに、忘れるので、certbotでLet’s EncryptなSSL証明書を取得するときのためのおぼえがき。

さて、気を取り直して、大真面目に不真面目なものを作っていきましょう。
・・とはいっても、流すコマンドは2つだけなんですが。

まずは、何はともあれ、秘密鍵を作りましょう。

$ sudo certtool --generate-privkey --sec-param High --outfile dummy.key
Generating a 3072 bit RSA private key...

これで、dummy.keyができました。
この鍵を、crtも作っていきましょう。--templateで使ってるdummy.cfgは、準備段階で作ったものです。

$ sudo certtool --generate-self-signed --load-privkey dummy.key --template dummy.cfg --outfile dummy.crt

これで、dummy.keydummy.crtがそろいましたね。

nginxの設定かきかき

証明書が出来上がったので、nginx.confをいじっていきましょう。

$ sudo vim /etc/nginx/nginx.conf

環境によってさまざまあるとは思いますが、うちの場合はこんな感じに設定してます。
default_serverできたものは全部444でさよならする感じ。
このさよならするだけの部分にわざわざ設定してます。設定したからといって、特段なんの意味もない、ただの自己満です。

http{
        #...#
        
        server {
                listen 80 default_server;
                listen [::]:80 default_server;
                server_name _;
                return 444;
        }
        server {
                listen 443 ssl http2 default_server;
                listen [::]:443 ssl http2 default_server;
                server_name _;
                ssl_certificate /etc/nginx/_dummy/dummy.crt; # <- CRT
                ssl_certificate_key /etc/nginx/_dummy/dummy.key; # <- KEY
                return 444;
        }
        
        #...#
}

書き換えが終わったら、リロードして、完了ですね。

$ sudo nginx -t && sudo systemctl restart nginx

ここまで書いておいてなんだけど、こんなしょうもないことに時間かけるなら、他の事した方が、有意義だよ。