SSL 인증서 서버 이름은 어떻게 확인 / 키툴을 사용하여 대체 이름을 추가 할 수 있습니까?
명확성을 위해 별도의 질문으로 표현 될 수 있습니다.
SSL 인증서 서버 이름은 어떻게 확인 검증?
브라우저가 인증서의 CN 필드를 사용하는 것처럼 보이지만 Java의 표현은 "주체 대체 이름"만 보이는 것처럼 보이는 이유는 무엇입니까?
keytool을 사용하여 SSL 인증서에 대체 이름을 추가 할 수 있습니까? 사용하는 것이 좋은 옵션입니까 ??
약간의 배경 지식 : HTTPS를 사용하여 여러 서버와 통신 비용 메인 서버가 필요합니다. 분명히 우리는 모든 서버에 대해 SSL 인증서를 구입하고 싶지만 서명 (많을 수 있음) 자체 인증서를 사용하고 싶습니다 (키툴을 생성하여). OS에서 사용할 수있는 인증서를 추가하면 브라우저 (IE 및 Chrome)가 연결되어 있습니다. 그러나 Java의 cacerts에 인증서를 추가 한 후에도 Java는 여전히 연결을 허용하고 받아들이지 않고 다음 예외를 발생 처리합니다.
원인 : java.security.cert.CertificateException : sun.security.util.HostnameChecker.matchIP (HostnameChecker.java:142) at sun.security.util.HostnameChecker.match (HostnameChecker.java:75)에 주제 대체 이름이 없습니다. com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity (X509T rustManagerImpl.java:264) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:250) at com. sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (Clien tHandshaker.java:1185) ... 14 more
테스트를 위해 com.sun.jbi.internal.security.https.DefaultHostnameVerifier 에서 복사 한 자체 HostNameVerifier를 구현하는 인증서를 Java가 신뢰하도록 만들 수 있습니다. HostnameVerifier가 그것을 받아 들여야 생각합니다.)
인증서 필드 CN을 호스트 이름 (일반적으로 IP 주소)으로 사용하고 있습니다.
내가 뭔가 잘못하고 있는지 알려주고 올바른 방향으로 안내해 주시겠습니까?
호스트 이름 확인을 수행하는 방법은 RFC 6125에 정의되어있어 매우 최근이며 모든 프로토콜에 대한 관행을 일반화하고 HTTPS에 수행하는 RFC 2818을 대체합니다 . (Java 7이 RFC 6125를 확신 할 수 없습니다. 이는 너무 최근일 수 있습니다.)
에서 RFC 2818 (3.1) :
dNSName 유형의 subjectAltName 확장이있는 경우 해당 확장을 ID로합니다. 이름이있는 인증서의 제목 필드에있는 (가장 구체적인) 일반 이름 필드를 사용합니다. 일반 이름의 사용은 기존 관행이지만 더 이상 사용되지 않는 인증 기관은 대신 dNSName을 사용하는 것이 좋습니다.
[...]
어떤 경우에는 URI가 호스트 이름이 아닌 IP 주소로 지정됩니다. 이 경우 iPAddress subjectAltName은 반드시 URI의 IP와 일치해야합니다.
어떤 특정 특정 문제는 호스트 이름이 아닌 CN에서 IP 주소를 사용하고 사실에서 비롯입니다. 일부 브라우저는 모든 도구가 사양을 엄격하게 준수하지 않기 때문에 작동 할 수 있습니다. 특히 RFC 2818의 "가장 도면"이 명확하게 정의되지 않았던 문제입니다 (RFC 6215의 토론 참조).
당신이 사용하는 경우 keytool
, 자바 7로,keytool
주체 대체 이름 (대한 문서의 표를 참조 포함하는 옵션이 있습니다 -ext
)은 사용할 수 당신 있습니다 -ext san=dns:www.example.com
또는 -ext san=ip:10.0.0.1
.
편집하다 :
변경하여 OpenSSL에서 SAN을 사용할 수 있습니다 openssl.cnf
( 제가 기억하는 한 전역 구성을 편집하지 않는 경우는 현재 디렉토리에서 사본을 선택하거나 OPENSSL_CONF
환경 변수를 사용하여 명시 적 위치를 선택할 수 있습니다 ).
다음 옵션을 설정하십시오 (먼저 괄호 안에 선택하십시오).
[req]
req_extensions = v3_req
[ v3_req ]
subjectAltName=IP:10.0.0.1
# or subjectAltName=DNS:www.example.com
여기에 환경 변수를 사용하는 좋은 방법이 있습니다 (구성 파일에서 수정하는 대신). http://www.crsr.net/Notes/SSL.html
'ProgramingTip' 카테고리의 다른 글
수동 개입없이 여러 솔루션간에 동일한 Resharper 설정을 공유하는 방법은 무엇입니까? (0) | 2020.10.27 |
---|---|
컴파일러가 로컬 인증서 변수를 최적화 할 수 있습니까? (0) | 2020.10.27 |
ng2-ng-container와 ng-template 태그의 차이점 (0) | 2020.10.27 |
StyleCop 규칙 위반 (0) | 2020.10.27 |
가로 세로 맞춤으로 UIImageView 정렬 (0) | 2020.10.27 |