ColdFusion CFHTTP I/O 예외:피어가 인증되지 않음 - 키 저장소에 인증서를 추가한 후에도
-
06-07-2019 - |
문제
저는 현재 결제 처리업체에서 일하고 있습니다.우리 서버에서 결제 URL을 찾아볼 수 있으므로 방화벽 문제는 아니지만 CFHTTP를 사용하려고 하면 I/O 예외가 발생합니다.피어가 인증되지 않았습니다.최신 보안 인증서를 cacerts 키 저장소에 다운로드하여 설치하고 CF를 다시 시작했지만 여전히 동일한 오류가 발생합니다.공급자 인증서뿐만 아니라 인증서 체인에 다른 2개의 Verisign 인증 기관 인증서도 설치했습니다.이 인증서는 최신 클래스 3 확장 검증 인증서 중 하나입니다.
이전에 이 문제를 발견하고 해결책을 찾은 사람이 있나요?
해결책
내 동료는 타사에 연결할 때 동일한 문제를 경험 한 후 다음을 발견했습니다.
http://www.coldfusionjedi.com/index.cfm/2011/12/diagnosing-a-cfhttp-issue--peer-not-authenticated
https://www.raymondcamden.com/2011/01/12/diagning-a-cfhttp-issue-peer-not-authenticated/
우리는 Pete Freitag의 의견에 제공된 솔루션을 페이지 아래로 더 사용했습니다. 작동하지만 JSAFEJCE 제공 업체의 특정 속성을 동적으로 제거하고 추가하는 것이 필요하므로주의해서 사용해야한다고 생각합니다.
아카이브를 위해 Pete Freitag의 의견의 원래 내용은 다음과 같습니다.
나는 이것을 조금 더 좁히고 keyagreement.diffiehellman을 제거했다. 전체 공급자. 당신이하는 방법은 다음과 같습니다.
<cfset objSecurity = createObject("java", "java.security.Security") /> <cfset storeProvider = objSecurity.getProvider("JsafeJCE") /> <cfset dhKeyAgreement = storeProvider.getProperty("KeyAgreement.DiffieHellman")> <!--- dhKeyAgreement=com.rsa.jsafe.provider.JSA_DHKeyAgree ---> <cfset storeProvider.remove("KeyAgreement.DiffieHellman")> Do your http call, but pack the key agreement if you want: <cfset storeProvider.put("KeyAgreement.DiffieHellman", dhKeyAgreement)>
CFHTTP를 사용할 때보 다 SSLSocketFactory를 사용하여 HTTPS 연결을 생성하여 스택 트레이스에서 약간의 세부 정보를 제공함으로써 이것을 알아 냈습니다.
yadayadayada Caused by: java.security.InvalidKeyException: Cannot build a secret key of algorithm TlsPremasterSecret at com.rsa.jsafe.provider.JS_KeyAgree.engineGenerateSecret(Unknown Source) at javax.crypto.KeyAgreement.generateSecret(DashoA13*..) at com.sun.net.ssl.internal.ssl.DHCrypt.getAgreedSecret(DHCrypt.java:166)
ColdFusion에서 발생하는 예외가 조금 덜 일반적인 경우에는 좋을 것입니다.
다른 팁
올바른 키 스토어에 추가 했습니까? ColdFusion은 자체 자바 인스턴스를 사용한다는 것을 기억하십시오. 나는 그 사실을 기억하기 전에 이것에 한 번 몇 시간을 보냈습니다. 당신이 원하는 것은/coldfusion8/runtime/jre/lib/security와 같은 곳입니다.
최신 SSL 암호를 사용하는 웹 서버를 사용하는 coldfusion 8에만 해당됩니다.
JDK 1.6.45에서 coldfusion 8을 사용하고 있는데 이미지 대신 빨간색 십자가만 표시하는 데 문제가 있었고 cfhttp에서는 SSL을 사용하여 로컬 웹 서버에 연결할 수 없습니다.
Coldfusion 8로 재현하기 위한 내 테스트 스크립트는 다음과 같습니다.
<CFHTTP URL="https://www.onlineumfragen.com" METHOD="get" ></CFHTTP>
<CFDUMP VAR="#CFHTTP#">
이로 인해 "I/O 예외:"라는 매우 일반적인 오류가 발생했습니다."나는 인증되지 않았다."그런 다음 Java Keystore와 Coldfusion Keystore에 루트 및 중간 인증서를 포함한 서버의 인증서를 추가하려고했지만 아무런 도움이되지 않았습니다.그런 다음 문제를 디버깅했습니다.
java SSLPoke www.onlineumfragen.com 443
그리고 얻었습니다
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
그리고
Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DashoA13*..)
at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:107)
... 10 more
그런 다음 웹 서버(내 경우에는 Apache)가 SSL에 대한 매우 현대적인 암호를 가지고 있고 매우 제한적이며(Qualys 점수 A+) 1024비트가 넘는 강력한 diffie hellmann 키를 사용한다는 아이디어를 얻었습니다.분명히 coldfusion과 java jdk 1.6.45는 이것을 관리할 수 없습니다.odysee의 다음 단계는 Java용 대체 보안 공급자 설치를 고려하는 것이었고 저는 Bouncy Castle을 선택했습니다.또한보십시오 http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/
그런 다음
bcprov-ext-jdk15on-156.jar
~에서 http://www.bouncycastle.org/latest_releases.html 그리고 C : JDK6_45 JRE lib ext 또는 JDK가 어디에 있든, 냉담 8의 원래 설치에 따라 C : jrun4 jre lib ext 아래에 있지만 새로운 JDK (1.6을 사용합니다. 45) Coldfusion 디렉토리 외부에 위치합니다.bcprov-ext-jdk15on-156.jar를 ext 디렉토리에 넣는 것이 매우 중요합니다 (이것은 약 2 시간과 약간의 머리카락 ;-) 그런 다음 파일을 편집 한 다음 c : jdk6_45 jre lib security . java.security (editor.exe!와 함께 WordPad와 함께) 새 공급자를 위해 한 줄을 넣습니다.그 후 목록은 다음과 같습니다
#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
(위치 1의 새 항목 참조)
그런 다음 Coldfusion 서비스를 완전히 다시 시작하십시오.그러면 넌 할 수 있어
java SSLPoke www.onlineumfragen.com 443 (or of course your url!)
그리고 그 느낌을 즐겨보세요..그리고 물론
정말 좋은 밤이고 좋은 하루입니다.이것이 누군가에게 (부분적으로 또는 완전히) 도움이 되기를 바랍니다.질문이 있으시면 info로 메일을 보내주세요.(위의 도메인).
CMD에서 이것을 사용해보십시오
C : ColdFusion9 runtime jre bin> keytool -import -keystore ../lib/security/cacerts-Alias uniquename -file intricaTename.cer
메모:bin 안에 다른 키 저장소 파일이 있으므로 보안 폴더 안에 있는 올바른 키 저장소를 선택해야 합니다. 인증서를 해당 키 저장소로 가져오면 작동하지 않습니다.
내가 방금 발견 한 것은이 기사에서 언급되었습니다. http://kb2.adobe.com/cps/400/kb400977.html 그리고 많은 파기 후 몇몇 다른 곳.
이 기사를보고 있다면 적절한 루트 위치에 "Server.crt"인증서를 삽입했을 가능성이 높으며 명령을 사용하여/coldfusion9/runtime/jre/lib/security의 Cacerts 파일에 삽입했을 것입니다.
\ColdFusion9\runtime\jre\bin\keytool -import -v -alias someServer-cert -file someServerCertFile.crt -keystore cacerts -storepass changeit
(이 작업을 수행하지 않았다면 지금하십시오). 내가 실행중인 것은 현지 호스트에 SSL을 설정하고 있다는 것이 었 으므로이 단계를 수행 한 후에도 여전히 같은 오류가 발생했습니다.
결과적으로 명령을 사용하여 "Server.crt"를 일반적으로/coldfusion9/runtime/jre/lib에있는 "Truststore"파일에 삽입해야합니다.
\ColdFusion9\runtime\jre\bin\keytool -import -v -alias someServer-cert -file someServerCertFile.cer -keystore trustStore -storepass changeit
바라건대 이것은 누군가 시간을 절약 할 수 있기를 바랍니다.
나는 Jrun을 사용하고 있습니다. 많은 다른 것들을 시도한 후, 나는 내 설정에 적용 할 수있는 정보의 스 니펫을 발견했습니다. 내 자신의 TrustStore 파일로 (1) https sslservice를 구성했습니다. 이로 인해 다음 링크의 정보가 중요해졌습니다.
http://helpx.adobe.com/coldfusion/kb/import-certificates-certificate-stores-coldfusion.html
참고 : JRUN을 기본 J2EE 서버 (서버 구성 또는 JRUN 구성이있는 MultiServer/J2EE)로 사용하고 내부 JRUN 웹 서버 (JWS) 용 SSL을 활성화 한 경우 인증서를 TrustStore로 가져와야합니다. JRE 키 스토어가 아닌 보안 JWS에 대해 jrun.xml 파일에 정의되었습니다. 기본적으로 파일은 "TrustStore"라고하며 일반적으로 JRUN 구성 또는 CF_ROOT/RUNTIME/LIB가있는 MultiServer/J2EE의 경우 JRUN_ROOT/LIB 아래에 위치합니다. 동일한 Java KeyTool을 사용하여 TrustStore를 관리합니다.
다음은 내 jrun.xml 파일의 발췌문입니다.
<service class="jrun.servlet.http.SSLService" name="SSLService">
<attribute name="port">8301</attribute>
<attribute name="keyStore">/app/jrun4/cert/cfusion.jks</attribute>
<attribute name="trustStore">/app/jrun4/cert/truststore.jks</attribute>
<attribute name="name">SSLService</attribute>
<attribute name="bindAddress">*</attribute>
<attribute name="socketFactoryName">jrun.servlet.http.JRunSSLServerSocketFactory</attribute>
<attribute name="interface">*</attribute>
<attribute name="keyStorePassword">cfadmin</attribute>
<attribute name="deactivated">false</attribute>
</service>
인증서를이 TrustStore (/app/jrun4/cert/truststore.jks)로 가져 오면 ColdFusion을 다시 시작한 후 작동했습니다.
(1) http://helpx.adobe.com/legacy/kb/ssl-jrun-web-server-connector.html
Keystore에 인증서를 추가하는 것은 CF9 Enterprise에서 나에게 효과가 없었습니다.
CFX 태그를 사용하여 결국 CFX_HTTP5
.