我承认我可能没有充分了解这个主题,但我已经做了一个阅读负荷,但仍然无法回答我的问题。
据我所知,为了使用HTTPS保证通信安全,我需要使用某种公钥(让我想起pgp加密)。
我的目标是从我的java应用程序(我在其开始工作的那一刻,将重写到Android应用程序,如果重要的话)发送一个安全的POST
请求到一个可通过https地址访问的php应用程序。
当然,我对这个主题进行了一些谷歌研究,我得到了很多关于如何建立ssl连接的结果。这些结果中没有使用任何种类的证书/哈希打印。他们只使用HttpsURLConnection
代替HttpURLConnection
,其他一切几乎相同。
现在,几乎复制我在这里找到的东西的粘贴是这样的:
String httpsURL = "https://xx.yyyy.zzz/requestHandler.php?getParam1=value1&getParam2=value2";
String query = "email=" + URLEncoder.encode("abc@xyz.com", "UTF-8");
query+="&";
query+="password="+URLEncoder.encode("tramtarie","UTF-8");
URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-length",String.valueOf(query.length()));
con.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
con.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)");
con.setDoOutput(true);
con.setDoInput(true);
DataOutputStream output = new DataOutputStream(con.getOutputStream());
output.writeBytes(query);
output.close();
DataInputStream input = new DataInputStream(con.getInputStream());
for(
int c = input.read();
c!=-1;c=input.read())
System.out.print((char)c);
input.close();
System.out.println("Resp Code:"+con.getResponseCode());
System.out.println("Resp Message:"+con.getResponseMessage());
遗憾的是,这种情况不起作用,并以此例外结束:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching app.elessy.cz found
这可能意味着它检查证书并发现我使用的证书与注册的域名不匹配(它是webhosting证书,注册为webhosting域,而不是我拥有的域名,唯一的原因我我使用https来保护数据用于内部目的,我不希望用户从外部访问此站点,因此该证书应该没问题。)
有两件事我不知道代码和所有内容。
根据给定的答案和重复的标记,我设法使其工作 - 意思是我可以与https后面的应用程序进行通信。 但我没有必要使用任何类型的md5 / sha1打印。我怎么知道它现在安全了?这个协议是他自己的吗?就像这种通信以任何方式保护一样,当我使用内置的java类来连接到https后面的app?
我可能不寻求精确的技术解释,但更多的是保证肯定 - 即使我不使用(知情)证书/服务器公钥来加密我的消息,通信也是安全的。它为我做了ssl连接。