
클라이언트 인증서를 사용하여 서버 웹 서비스를 호출해야 한다는 요구 사항이 있습니다. 그들은 나에게 하나의 .crt 파일을 제공했습니다. 저는 WindowsServer2008 IIS7에서 프로젝트를 호스팅하고 있습니다.
전체 인증서 요청으로 서버 인증서에 인증서를 추가할 수 없으므로 마우스 오른쪽 버튼 클릭 속성에서 .crt를 설치합니다. 오류가 발생했습니다.
CertEnroll::CX509Enrollment::p_InstallResponse: ANSI bad tag value met.
.crt 클라이언트 인증서를 설치하는 방법에 대해 검색했지만 아무것도 찾지 못했습니다. 설명대로 설치도 해보았습니다여기4단계에서
그리고 내가 이렇게 전화했을 때
string certPath = Server.MapPath("../certificate/iot01.servername.crt");
X509Certificate2 cert = new X509Certificate2(certPath);
ws.ClientCertificates.Add(cert);
res = ws.methodName(params);
오류가 발생했습니다: System.IO.IOException: 예기치 않은 패킷 형식으로 인해 핸드셰이크가 실패했습니다. System.Net.Security.SslState.StartReadFrame(Byte[] 버퍼, Int32 readBytes, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState. System.Net.Security.SslState.StartSendBlob(Byte[] 수신, Int32 개수, AsyncProtocolRequest asyncRequest)의 CheckCompletionBeforeNextReceive(ProtocolToken 메시지, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] 버퍼, AsyncProtocolRequest asyncRequest) at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResultlazyResult) at System.Net.TlsStream.CallProcessAuthentication(객체 상태) at System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext, ContextCallback 콜백, 객체 상태, 부울 보존SyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext, ContextCallback 콜백, 개체 상태, 부울 보존SyncCtx) System.Threading.ExecutionContext.Run(ExecutionContext 실행 컨텍스트, ContextCallback 콜백, 개체 상태) System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult 결과) System.Net.TlsStream.Write(Byte[] 버퍼, Int32 오프셋, Int32 크기) at System.Net.PooledStream.Write(Byte[] 버퍼, Int32 오프셋, Int32 크기) at System.Net.ConnectStream.WriteHeaders(Boolean 비동기) System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest 요청) at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest 요청) at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] 매개변수) at .....
내 인증서 설치 및 호출과 관련이 있습니까? 누군가 내가 어디에서 잘못되었는지 알려줄 수 있습니까?
답변1
나는 그것이 당신의 소명, 즉 당신이 따라야 할 단계와 관련이 있다고 믿습니다.
문제의 핵심을 파악하기 위한 무차별 대입 방법으로 다음을 수행하십시오.
완전히 다른 새 프로젝트를 사용하여 "여기"라고 하는 링크의 단계를 사용하여 서버 인증에 대한 부분을 테스트하기 위한 코드를 만듭니다. 이렇게 하면 디버깅 기능을 방해할 수 있는 다른 문제를 방지할 수 있습니다.
하지만 빠른 확인을 위해,
첫 시도 대신 EXPLICIT TLS 연결을 사용하여 SSL 대신 TLS가 필요하지 않은지 확인하십시오.
TLS를 시작하는 연결 개체의 메서드를 확인하세요. http://www.limilabs.com/blog/the-handshake-failed-due-to-an-unexpected-packet-format
client.Connect("mail.example.com");
client.StartTLS();
로깅에는 4개의 실행(프로세스 5068, 3984, 1628 및 7124)이 있는 것 같습니다. 후자의 세 가지가 작동합니까? 뭔가 바뀌었나요?
적어도 5068의 경우~이다STLS 명령을 보낸 후 응답을 읽었지만~ 아니다서버의 첫 번째 "i'm Alive" 라인을 읽는 중입니다. 예를 들어 Wikipedia를 참조하세요.
S: C: S: +OK POP3 서버 준비됨 <[이메일 보호됨]>
따라서 해당 줄을 읽어야 합니다.~ 전에STLS 명령을 보냅니다. 5068에서 SslStream이 SSL 응답 대신 +OK B[egin SSL...] 응답을 얻는 것을 볼 수 있습니다.
나중에: 이제 무슨 일이 일어나고 있는지 알 수 있습니다. 다른 세 가지 실행에서는 스트림이 실행됩니다. 읽기 작업은 두 응답 라인을 모두 읽는 것입니다! 그러니 효과가 있든 없든 운이 좋을 뿐입니다.
예를 들어 이전 샘플에서는 두 줄을 모두 인쇄하지 않았지만 지금은 두 줄을 모두 인쇄합니다.
D:\Temp>SslStartTest.exe -client2 localhost 110 resp: +OK <[이메일 보호됨]>, POP3 서버가 준비되었습니다. resp: +OK SSL/TLS 협상 시작... HandleLocalCertificateSelectionCallback HandleRemoteCertificateValidationCallback SslPolicyErrors: RemoteCertificateNameMismatch, RemoteCertificateChainErrors TLS 세션이 연결되었습니다. :-) 암호: TripleDes 강도 168 해시: Sha1 강도 160 키 교환: RsaSign 강도 1024 프로토콜: Tls 인증됨: 서버로서 True인가요? False IsSigned: True Is Encrypted: True 인증서 해지 목록 확인됨: False 로컬 인증서가 null입니다. 원격 인증서는 CN=alanjmcf.example.com에 발급되었으며 2009년 3월 4일 1 0:47:40부터 2029년 3월 29일 10:47:40까지 유효합니다. 읽을 수 있음: True, True 쓰기 가능 시간 초과: True ^C