https客户端加载证书失败,不能发送请求

pasta_loveless 2010-12-03 01:09:38
现在客户已近给我jks证书了,并且有效,没过期,但是用下面的方法访问的时候,出现下面的异常,请问下大家有什么好的解决办法,小弟不胜感激!

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:179)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:186)
at sun.net.www.protocol.https.HttpsClient.createSocket(HttpsClient.java:360)
at sun.net.NetworkClient.doConnect(NetworkClient.java:145)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:271)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:328)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:793)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at Interface.InterfacePost.connect(InterfacePost.java:32)
at Interface.TestPost.main(TestPost.java:20)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)
at java.security.Provider$Service.newInstance(Provider.java:1245)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:220)
at sun.security.jca.GetInstance.getInstance(GetInstance.java:147)
at javax.net.ssl.SSLContext.getInstance(SSLContext.java:125)
at javax.net.ssl.SSLContext.getDefault(SSLContext.java:68)
at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:102)
at javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:325)
at javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:283)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.<init>(HttpsURLConnectionImpl.java:65)
at sun.net.www.protocol.https.Handler.openConnection(Handler.java:42)
at sun.net.www.protocol.https.Handler.openConnection(Handler.java:37)
at java.net.URL.openConnection(URL.java:945)
at Interface.InterfacePost.connect(InterfacePost.java:31)
... 1 more










以下是我的代码:

public class TestPost {
public static void main(String[] args) {
try {
// 要提交到的地址
String url = "https://eairiis-stgdmz.paic.com.cn/invoke/wm.tn/receive?";
// 要提交的文件名,具体到路径
String filenameToSend = "VERIFY.xml";
// JKS证书路径
String keyStore = "stg.jks";
// JKS密码
String keyStorePassword = "622689";
// 私钥证书路径
String trustStore = "stg.pfx";
// 私钥证书密码
String trustStorePassword = "11111111";
InterfacePost ix = new InterfacePost();

ix.connect(url, filenameToSend, keyStore, keyStorePassword, trustStore, trustStorePassword);

} catch (Exception e) {
e.printStackTrace();
}
}
}


class InterfacePost {

public InterfacePost() {
}

public void connect(String url1, String filenameToSend,
String keyStore, String keyStorePassword,
String trustStore, String trustStorePassword) throws Exception {
URL url = new URL(url1);

HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("URL Host: " + session.getPeerHost());
return true;
}
};

System.setProperty("javax.net.ssl.keyStore",keyStore);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword);
System.setProperty("javax.net.ssl.trustStore",trustStore);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("java.protocol.handler.pkgs","sun.net.www.protocol");
HttpsURLConnection.setDefaultHostnameVerifier(hv);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect(); //这句有问题
if (connection instanceof javax.net.ssl.HttpsURLConnection) {
System.out.println("connected");

} else {
System.out.println("diff instance ");
}

connection.setRequestProperty("Content-Type", "text/xml");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);

File f = new File(filenameToSend);
byte data[] = new byte[(int) f.length()];
FileInputStream fis = new FileInputStream(f);
fis.read(data);
fis.close();
connection.getContent();
OutputStream out = connection.getOutputStream();

out.write(data);
String aLine = null;
InputStreamReader inReader = new InputStreamReader(connection.getInputStream(), "UTF-8");
BufferedReader aReader = new BufferedReader(inReader);
while ((aLine = aReader.readLine()) != null)
System.err.println(aLine);
aReader.close();
connection.disconnect();
}
}



...全文
995 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jlins 2010-12-19
  • 打赏
  • 举报
回复
晕 这个真的不懂了
swoky 2010-12-19
  • 打赏
  • 举报
回复
你这是eclipse运行还是?使用的是你安装的JDK吗,不行就命令行运行

你打印下证书的签名信息,是否都正确

实在不行,用另外一种方法试试:
将证书导入JDK中,HostnameVerifier默认(不知道你这有证书为什么还要设为true)
默认情况下keyStore应该是%java_home%\jre\lib\security\cacerts


yudongming 2010-12-19
  • 打赏
  • 举报
回复
学习。
zoutuo 2010-12-18
  • 打赏
  • 举报
回复
同问!!!!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧