OpenSSL は、コンピューターネットワーク上の通信を盗聴から守ったり、相手側を識別したりする必要があるアプリケーション向けのソフトウェアライブラリです。HTTPS ウェブサイトの大多数を含む多くのインターネットサーバーで広く使用されています。
このライブラリは、セキュア接続が必要な場合にIndy Libraryに基づくコンポーネントによって必要とされます。アプリケーションがOpenSSLを必要とする場合は、アプリケーションをデプロイする前にファイルシステムに必要なファイルを用意する必要があります:
現在、sgcWebSocketsは次のopenSSLバージョンをサポートしています: 1.0.2、1.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 ライブラリの設定方法を以下に示します。
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 追加関数のロードをご覧ください。
サーバーで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 などのイベントが接続スレッドのコンテキストで発火することを意味し、同期の問題を回避してパフォーマンスを向上させます。欠点として、たとえばメッセージ受信時にフォームのビジュアルコントロールを更新する場合は、ビジュアルコントロールはスレッドセーフではないため、独自の同期メソッドを実装する必要があります。