Ubuntu 20.04에 따라 OpenSSL 1.1.1f를 설치했으며 특히 TLS v1.2 제품군 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
( ECDHE-ECDSA-AES128-CCM8
)을 활성화하고 싶습니다.
TLS용 OpenSSL 설치를 사용하는 다른 애플리케이션이 이 암호화 제품군을 사용할 수 있도록 OpenSSL을 구성하려면 어떻게 해야 합니까?
내 사용 사례에 대한 세부 정보: .NET(6) 애플리케이션이 있고.NET은 현재 OpenSSL을 사용합니다.1.1.1 이상은 다음과 같이 설치됩니다.Linux의 하위 수준 TLS 공급자. 따라서 제가 아는 한, 애플리케이션이 OpenSSL을 사용하는 경우 CCM 암호화 제품군을 허용하도록 OpenSSL을 구성해야 합니다. ( openssl.cnf
에 따라 사용됩니다 openssl version -d
)
OpenSSL 매뉴얼의 구성 섹션에서 구성에 관심이 있는 모듈이 이라는 것을 확인 ssl_conf
하고 다음 cnf를 만들었습니다.
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
CipherString = ECDHE-ECDSA-AES128-CCM8
그러나 이는 애플리케이션이 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8을 사용하는 것을 허용하지 않습니다. 내 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 독점 클라이언트가 연결을 시도하면 내부적으로 애플리케이션이 오류를 발생시키기 때문에 핸드셰이크 40으로 실패합니다.'Interop.OpenSsl.SslException' in System.Net.Security.dll
그러나 암호화 문자열의 유일한 필터로 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 대신 다음 cnf를 사용하면 애플리케이션이 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256을 독점적으로 사용할 수 있고 예상대로 작동하기 때문에 이 프로필이 작동한다는 것을 확인했습니다(...GCM_SHA256 전용 클라이언트가 연결할 수 있음).
...
[system_default_sect]
CipherString = ECDHE-RSA-AES128-GCM-SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8을 활성화하는 방법은 무엇입니까?
그리고 CCM이 활성화되었는지 확인하는 방법을 잘 모르겠습니다... 실행하면 openssl ciphers -v
(암호 문자열 필터 없이) TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256이 나열된 것처럼 CCM8이 나열되는 것을 볼 수 있기를 바랍니다.
나는 이 요리책의 구성 섹션을 읽었습니다.https://www.feistyduck.com/library/openssl-cookbook/online/openssl-command-line/configuration.html, 그런데 CCM8을 그냥 사용할 수 없는 이유에 대해서는 경험 많은 조언이 필요할 것 같습니다.
답변1
.NET 애플리케이션과 함께 사용하기 위해 기본이 아닌 암호화 제품군을 "활성화"하려면 OpenSSL을 구성해야 합니다. .NET 애플리케이션과 같은 많은 프레임워크 애플리케이션은 내부적으로 OpenSSL을 사용합니다. OpenSSL 구성을 생성한 다음 환경 변수를 OPENSSL_CONF
구성 파일의 전체 경로로 설정할 수 있습니다. OpenSSL을 사용하는 대부분의 애플리케이션은 OPENSSL_CONF
환경 변수를 사용하여 OpenSSL을 사용할 때 사용해야 하는 구성 파일을 얻습니다. OpenSSL은 openssl.cnf
모든 암호화 제품군을 활성화하지 않는 기본 설정을 사용하여 애플리케이션이 덜 안전한 암호화 제품군을 사용하지 않도록 합니다.
애플리케이션 사용이 허용되면 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
다음 구성 파일을 생성할 수 있습니다.
# myCustomOpenSSL.cnf
openssl_conf = default_conf
[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
#CipherString is a colon separated list of terms that filter what TLS v1.2 suites OpenSSL will allow use of.
[system_default_sect]
CipherString = ECDHE-ECDSA-AES128-CCM8
그런 다음 동일한 셸 인스턴스에서 애플리케이션을 시작하기 전에 설정하거나 OPENSSL_CONF
(그래서 이것이 맞습니다), 애플리케이션을 개발하는 경우 애플리케이션 코드에서 설정할 수 있습니다./example/path/myCustomOpenSSL.cnf
OPENSSL_CONF
OPENSSL_CONF
...
내 문제는 ECDSA 인증서를 애플리케이션에 제공하지 못했다는 것입니다. TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
이 애플리케이션을 사용하려면~ 해야 하다ECDSA 인증서가 있어야 합니다. 즉, ECDSA 키로 서명하세요. 저는 Visual Studio에서 작업 중이며 WSL을 통해 애플리케이션을 실행하고 있습니다. NET 의 Visual Studio /etc/ssl/certs
기본 개발 인증서는 RSA 기반이므로 애플리케이션이 인증서가 없다고 불평하지는 않지만 호환되지 않는 인증서가 있으므로 예외가 발생합니다 'Interop.OpenSsl.SslException' in System.Net.Security.dll
.
그래서 기본으로 개발된 RSA 기반 인증서 대신 ECDSA 기반 인증서를 사용하도록 애플리케이션을 구성해 보았는데, 짜잔!
그래서 내가 만든 cnf 파일이 "활성화"되려고 합니다 TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
.
참고: .NET에서는 암호화 제품군 선택을 위해 OpenSSL cnf를 사용할 필요가 없습니다.CipherSuitePolicy를 생성할 수 있습니다.코드에서 애플리케이션 암호화 제품군을 정의하세요.