OpenSSL

OpenSSL은 컴퓨터 네트워크를 통한 통신을 도청으로부터 보호하거나 상대방을 식별해야 하는 애플리케이션을 위한 소프트웨어 라이브러리입니다. 대다수의 HTTPS 웹사이트를 포함하여 인터넷 서버에서 널리 사용됩니다.

 

이 라이브러리는 보안 연결이 필요할 때 Indy Library 기반 구성 요소에 필요합니다. 애플리케이션에 OpenSSL이 필요한 경우, 애플리케이션을 배포하기 전에 파일 시스템에 필요한 파일이 있어야 합니다:

 

현재 sgcWebSockets는 다음 openSSL 버전을 지원합니다: 1.0.2, 1.13.0 ~ 3.3.

 

Platform API 1.0 API 1.1 API 3.* 정적/동적 링킹
Windows (32비트 및 64비트) libeay32.dll and ssleay32.dll libcrypto-1_1.dll and libssl-1_1.dll libcrypto-3.dll and libssl-3.dll Dynamic
OSX libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib Dynamic
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 Dynamic
Android Device libcrypto.so, libssl.so libcrypto.so, libssl.so libcrypto.so, libssl.so Dynamic

 

 

각 플랫폼에 대해 OpenSSL을 구성하는 방법은 아래에서 확인하십시오:

 

 

openSSL 구성

sgcWebSockets Indy 기반 구성 요소를 사용하면 일부 OpenSSL 속성을 구성할 수 있습니다. 다음 속성에 액세스할 수 있습니다:

 

 

API Version

 

표준 Indy 라이브러리1.0.2 OpenSSL 라이브러리만 로드할 수 있습니다. 이 라이브러리는 더 이상 사용되지 않으며 최신 OpenSSL 릴리스는 1.1.1 API를 사용합니다.

sgcWebSockets Enterprise를 사용하면 1.1.1 openSSL 라이브러리를 로드할 수 있으며, 이 속성에서 어떤 openSSL API 버전이 로드될지 구성할 수 있습니다. 프로세스당 하나의 API 버전만 로드할 수 있습니다(따라서 동일한 애플리케이션에서 openSSL 1.0.2와 1.1.1 라이브러리를 혼합할 수 없습니다).

 

 

LibPath

 

이 속성을 사용하면 openSSL 라이브러리의 위치를 설정할 수 있습니다. 이는 openSSL 라이브러리의 위치를 설정해야 하는 Android 또는 OSX 프로젝트에 유용합니다.

다음 값을 수락합니다:

 

 

 

Load Additional OpenSSL Functions

기본적으로 정의되지 않은 추가 OpenSSL 함수를 로드하려면 콜백을 사용하십시오. OpenSSL Load Additional Functions에서 자세히 읽을 수 있습니다.

 

Ciphers

서버에서 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

cert.pem(인증서)과 key.pem(개인 키) 2개의 파일이 생성됩니다. 두 파일을 하나로 결합할 수 있습니다. 새 파일을 만들고 두 파일의 내용을 그 안에 복사하기만 하면 됩니다. 그러면 다음과 같은 구조가 됩니다:

 

-----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...)가 스레드 연결의 컨텍스트에서 발생함을 의미하며, 이는 일부 동기화 문제를 방지하고 더 나은 성능을 제공합니다. 단점으로, 예를 들어 메시지를 수신할 때 폼의 시각적 컨트롤을 업데이트하는 경우, 시각적 컨트롤은 스레드 안전하지 않으므로 자체 동기화 메서드를 구현해야 합니다.