OpenSSL

OpenSSL は、コンピューターネットワーク上の通信を盗聴から守ったり、相手側を識別したりする必要があるアプリケーション向けのソフトウェアライブラリです。HTTPS ウェブサイトの大多数を含む多くのインターネットサーバーで広く使用されています。

 

このライブラリは、セキュア接続が必要な場合にIndy Libraryに基づくコンポーネントによって必要とされます。アプリケーションがOpenSSLを必要とする場合は、アプリケーションをデプロイする前にファイルシステムに必要なファイルを用意する必要があります:

 

現在、sgcWebSocketsは次のopenSSLバージョンをサポートしています: 1.0.21.1、および3.0 から 3.3

 

プラットフォーム API 1.0 API 1.1 API 3.* 静的/動的リンク
Windows(32 ビットおよび 64 ビット) libeay32.dll および ssleay32.dll libcrypto-1_1.dll and libssl-1_1.dll libcrypto-3.dll and libssl-3.dll ダイナミック
OSX libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib ダイナミック
iOS Device (32-bit and 64-bit) libcrypto.a と libssl.a libcrypto.a と libssl.a libcrypto.a と libssl.a Static
iOS Simulator libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib ダイナミック
Androidデバイス libcrypto.so, libssl.so libcrypto.so, libssl.so libcrypto.so, libssl.so ダイナミック

 

 

各プラットフォームの OpenSSL ライブラリの設定方法を以下に示します。

 

 

OpenSSL の設定

sgcWebSockets の Indy ベースのコンポーネントでは、いくつかの OpenSSL プロパティを設定できます。次のプロパティにアクセスしてください。

 

 

API バージョン

 

Standard Indy ライブラリ1.0.2 OpenSSL ライブラリのみのロードを許可します。これらのライブラリは非推奨となり、最新の OpenSSL リリースは 1.1.1 API を使用しています。

sgcWebSockets Enterpriseでは、1.1.1 openSSLライブラリを読み込むことができます。このプロパティで、どのopenSSL APIバージョンを読み込むかを構成できます。プロセスごとに読み込めるAPIバージョンは1つだけです(そのため、同じアプリケーションでopenSSL 1.0.2と1.1.1のライブラリを混在させることはできません)。

 

 

LibPath

 

このプロパティを使用して OpenSSL ライブラリの場所を設定できます。Android または OSX プロジェクトで OpenSSL ライブラリの場所を設定する必要がある場合に役立ちます。

以下の値を受け付けます:

 

 

 

追加のOpenSSL関数の読み込み

デフォルトで定義されていない追加の OpenSSL 関数をロードするためにコールバックを使用します。詳細は OpenSSL 追加関数のロードをご覧ください。

 

暗号

サーバーでTLS 1.2および1.3のサポートを提供し、最高のセキュリティとパフォーマンスを使用する場合は、次の設定を使用します。

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.VersionMin := tls1_2;

SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;

 

次の暗号スイートリストを設定します。

 

AEAD-AES128-GCM-SHA256:AEAD-AES256-GCM-SHA384:AEAD-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

 

自己署名証明書

テスト目的で自己署名証明書を使用できます。自己署名証明書を作成するには以下のコマンドを実行するだけです。

 

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

2 つのファイルが作成されます:cert.pem(証明書)と key.pem(秘密鍵)。両方のファイルを 1 つのファイルに結合できます。新しいファイルを作成し、両方のファイルの内容をそこにコピーします。構造は次のようになります。

 

-----BEGIN PRIVATE KEY-----

....

-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

....

-----END CERTIFICATE-----

 

一般的なエラー

SSL_GET_RECORD: wrong version number

 

このエラーは、サーバーとクライアントが異なるバージョンのSSL/TLSプロトコルを使用していることを意味します。これを修正するには、サーバーおよび/またはクライアントコンポーネントで正しいバージョンを設定してみてください。

 

Server.SSLOptions.Version

Client.TLSOptions.Version

 

SSL3_GET_RECORD: decryption failed or bad record mac

 

通常このエラーは次の場合に発生します:

 

1. 最新の OpenSSL バージョンを使用しているか確認してください。古すぎる場合は最新のサポートバージョンにアップデートしてください。

2. このエラーがランダムに発生する場合、通常は複数のスレッドが OpenSSL 接続に同時にアクセスしているためです。NotifyEvents = neNoSync を設定してみてください。これは OnConnect、OnDisconnect、OnMessage などのイベントが接続スレッドのコンテキストで発火することを意味し、同期の問題を回避してパフォーマンスを向上させます。欠点として、たとえばメッセージ受信時にフォームのビジュアルコントロールを更新する場合は、ビジュアルコントロールはスレッドセーフではないため、独自の同期メソッドを実装する必要があります。