TLS (旧SSL)

【図解】分かりやすい OpenSSL の仕組み,使い方 ~Windowsへのインストール要否~

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 については以下を参照下さい。

【図解】SSLとTLSの違いと概要 ~シーケンスや応用プロトコル,STARTTLSについて〜
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 コマンドで証明書を作成しています。

Zabbix 6.0 LTS をRHEL8系, Nginx, MySQL でインストール/構築する
前提 RedHat8 系の OS (CentOS/Rocky Linux/Alm...

併せて 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 つになります。

内容OpenSSLWindows標準
鍵ペア作成openssl genrsa等certreq -new
(秘密鍵は証明書ストアに格納される)
CSR 生成openssl req -new
証明書作成 (署名)openssl x509 -req
ファイルのハッシュ計算(md5)openssl md5 a.txtcertutil -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 で公開してくれています。

https://github.com/NCSC-NL/OpenSSL-2022/tree/main/software

コメント

タイトルとURLをコピーしました