OpenSSL を分かりやすく解説
OpenSSL とは、SSL/TLS に関する様々な機能を保有した『コマンド&ライブラリ』の無償で利用可能なソフトウェアです。The OpenSSL Project にて開発が行われています。
Linux で使われるイメージが強いですが、C 言語で書かれているため、NW 機器や Windows 等の上でも使うことができます。(使う環境に合わせてソースコードをコンパイル、ビルドする必要あり)
例えば FortiGate でも SSL-VPN などの機能において OpenSSL を利用しているようですので、OpenSSL の脆弱性公開の対処として FortiOS のアップデートを行っていたりします。
OpenSSL はその名前の通りオープンソースですが、名前とは異なり、SSL プロトコルは (現実的には) 使われず、後継の TLS プロトコルを実現するために使われます。
「SSL」のほうが (主に非技術者には) 馴染みがあるようで、各所で「SSL」という言葉が使われますが、それらは現実的には全て TLS のことを指しています。(本ブログではそのような背景も踏まえ SSL/TLS と表現したりします。)
SSL と TLS については以下を参照下さい。
OpenSSL のコマンドとライブラリ
OpenSSL は大きく 2 つの構成に分かれています。
1 つは「コマンド」を使った人間による操作で、例えば以下のような操作ができます。
- 秘密鍵、CSR、証明書を作成
- 暗号化・復号やハッシュの計算
- TLS 通信のテスト
- S/MIME によるメールの署名や暗号化
もう 1 つは「ライブラリ」として SSL/TLS 通信を行うためのもので、Apache や Nginx 等のサービス等から読み込まれて利用されます。
コマンド、もしくはライブラリなので、OpenSSL が単体でサービス/プロセスとして常駐することはありません。あくまで、人がシェル等からコマンドを呼び出すか、他のサービスがライブラリとして呼び出すものです。
ちなみに、Linux ではどのプロセスがライブラリを読み込んでいるかを以下コマンドで確認できます。
[test@localhost ~]$ sudo lsof | grep -e libssl.so -e COMMAND COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME firewalld 699 root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 firewalld 699 838 gmain root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 firewalld 699 13968 gdbus root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 NetworkMa 751 root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 NetworkMa 751 762 gmain root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 NetworkMa 751 763 gdbus root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 nginx 14042 root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 nginx 14043 nginx mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 nginx 14044 nginx mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1 sudo 14730 root mem REG 253,0 685160 33774278 /usr/lib64/libssl.so.3.0.1
また、細かい補足ですが、Apache は mod_ssl というモジュールの読み込みが必要になり、それが OpenSSL とのインタフェースになりますが、Nginx は mod_ssl 等のモジュールは不要で、Nginx 本体で使えるようになっています。
OpenSSL の一般的な使われ方 [Web サーバ Nginx を https 対応にする]
以下の記事では、Zabbix というオープンソースの監視ツールの Web 管理画面を https 化していますが、OpenSSL コマンドで証明書を作成しています。
併せて Nginx にて https の設定もしていますが、これにより Nginx に対して https のリクエストが届くと、Nginx は OpenSSL ライブラリを使って https 通信を構成しクライアントとやり取りをします。
OpenSSL と Windows へのインストール要否
OpenSSL は Windows にもインストールできますが、Windows にもある程度ですが似た機能を持ったコマンドとライブラリがあります。certreq, certutil と schannel.dll です。
certreq.exe は鍵ペアの作成/CSR 生成が可能ですが、証明書を作成することはできません。(別途、自前構築の認証局 or 公的な認証局に証明書の発行を依頼する必要がある)
以下に OpenSSL と Windows 標準機能の対応表を示します。プライベート認証局が無いけど証明書を作成したいときや、TLS の通信テストをしたいときなどにおいては、Windows に OpenSSL をインストールする、というのも手段の 1 つになります。
内容 | OpenSSL | Windows標準 |
---|---|---|
鍵ペア作成 | openssl genrsa等 | certreq -new (秘密鍵は証明書ストアに格納される) |
CSR 生成 | openssl req -new | |
証明書作成 (署名) | openssl x509 -req | - |
ファイルのハッシュ計算(md5) | openssl md5 a.txt | certutil -hashfile a.txt md5 |
TLS 通信接続テスト | openssl s_client openssl s_server (libssl を多用) | - |
TLS 通信用ライブラリ | libssl*, libcrypto* | schannel.dll |
また、TLS 通信用ライブラリとしては Windows 標準で「schannel.dll」というライブラリがあります。ブラウザの https や Remote Desktop Protocol, 無線の IEEE802.1x 認証等では、この schannel.dll ライブラリによって TLS 通信を実現しています。
名前から MS-RPC のセキュアチャネルとごっちゃにされてしまうことがありますが、別物です。
2022年11月1日追記: 脆弱性の影響有無について
OpenSSL 3.X の脆弱性が話題になっています。
オランダのサイバーセキュリティ機関「NCSC-NL」が各種製品の影響有無を一次ソースへのリンク付きで github で公開してくれています。
コメント