OpenSSL과 TLS를 사용하여 SSH와 같은 신뢰 모델을 제공하려고합니다. 즉, 두 피어간에 각각 인증서가 저장되어있는 RSA 키 쌍이 있습니다. 또한 TLS 세션을 설정하기 전에 공개 키를 교환했습니다. 초기화 동료 동안TLS : RSA 키를 사용하여 자체 서명 한 인증서를 확인하는 방법
는 메모리, 일시적 X509 인증서를 생성 : 난 아직도 의심이 그래서 일부에는 OpenSSL의 문서화되지 않은 기능을 사용하고이를 달성하기 위해, 여기에 방법이다. 여기에는 더미 CN 데이터, 발급자 및 만료되기 몇 년 전에 빠져 나갈 수있는 최소 더미 데이터가 포함되어 있습니다. 어쨌든 확인되지 않습니다. SSL 컨텍스트는 두 가지 방법으로 두 인증서를 교환하도록 설정됩니다.
중요한 단계는 인증서가 호스트의 공개 키를 포함하고 개인 키를 사용하여 서명되어 있습니다 :
EVP_PKEY *pkey = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pkey, PRIVKEY); X509_set_pubkey(x509, pkey); X509_sign(x509, pkey, EVP_sha384());
이 인증서는
SSL_CTX
에 할당 된 전체 애플리케이션 수명에 사용됩니다.
TLS 세션이 설정되었을 때 나는 대부분 인증 프로세스에 대해 걱정하고 있습니다. 나는 SSL_CTX_set_cert_verify_callback(always_true_func)
를 사용하여 OpenSSL을 수행 한 모든 검증을 비활성화하고 같이 내 자신의 롤 해요 :
X509 *received_cert = SSL_get_peer_certificate(conn_info->ssl);
EVP_PKEY *received_pubkey = X509_get_pubkey(received_cert);
if (EVP_PKEY_type(received_pubkey->type) != EVP_PKEY_RSA)
error();
ret = X509_verify(received_cert, received_pubkey);
if (ret <= 0)
error("trust_failed");
// Compare received public key with expected one
RSA *expected_rsa_key = read_RSA_key_from_disk();
EVP_PKEY expected_pubkey = { 0 };
EVP_PKEY_assign_RSA(&expected_pubkey, expected_rsa_key);
EVP_PKEY_cmp(received_pubkey, &expected_pubkey);
if (ret == 1)
return true; // identity verified!
else
return false;
질문을 :에는 OpenSSL API의 적절한 사용인가? 특히 마지막 부분에 수신 된 키 확인과 관련된 보안 허점이 있습니까? 동일한 결과를 얻을 수있는 더 좋은 방법은 없을까요?
편집 : 대답 :은 TLS 핸드 쉐이크가 저장된 RSA 키와 일치하는 동안 자체 서명 된 인증서를 수신하는지 확인하려면 인증서의 서명, 즉 X509_verify
에 대한 필요가 없습니다를 확인 할 필요가 없다. 수신 된 공개 키와 예상 된 키의 비교로 충분합니다.
이유입니다 (박사 스티븐 헨슨은 OpenSSL 프로젝트의 핵심 개발자를 인용) "은 RSA 암호 해독 작업 또는 RSA 서명 작업 중 하나가 서버에서 수행되는 암호 군에 따라. 핸드 쉐이크가 성공적를 을 완료 그래서 만약 인증서 "에있는 것과 동일한 키가 사용되었는지 확인할 수 있습니다.
내 견해로는 두 가지를 확인해야합니다. 첫째, 인증서에 내가 아는 공개 키가 포함되어 있다는 것입니다. 그러나 두 번째는 실제로 누군가가 * 호스트의 공용 키 (public ...)를 보낼 수 있기 때문에 자체 서명 된 인증서가 유효하게 서명되었는지 확인하는 것입니다. EVP_PKEY_cmp() 및 2.X509_verify()를 사용하여이 두 가지 작업을 수행합니다. – jimis
TLS 프로토콜, 특히 CertificateVerify 메시지의 팁을 내부적으로 살펴 주셔서 감사합니다. 나는 이것에 돌아 왔고 [wikipedia] (http://en.wikipedia.org/wiki/Transport_Layer_Security)에서 그것을 이해하려고 노력했다. "이 서명은 클라이언트의 인증서 공개 키를 사용하여 확인할 수 있으므로 클라이언트가 인증서의 개인 키에 액세스하여 인증서를 소유하고 있음을 서버가 알 수 있습니다."라는 CertificateVerify 메시지에 대해 다음과 같이 설명합니다. 하지만 OpenSSL에서 verify_callback을 덮어 씀으로써 모든 인증을 비활성화 했으므로 언제 sig를 확인 했습니까? – jimis