HTTPS Опубликовать запрос (не) с использованием сертификата / печати хеша?
Я признаю, что есть вероятность, что я не очень хорошо осведомлен о предмете, но я сделал НАГРУЗКИ чтения, и я все еще не могу получить ответ на свой вопрос.
Из того, что я узнал, чтобы сделать связь безопасной с HTTPS, мне нужно использовать какой-то открытый ключ (напоминает мне о pgp-шифровании).
Моя цель - сделать безопасным POST
запрос из моего java-приложения (которое я, в момент его начала, перепишу в Android-приложение, если оно имеет значение), в php-приложение, доступное по адресу https.
Естественно, я провел некоторые исследования Google по этой теме и получил много результатов о том, как установить 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
Это, вероятно, означает, что он проверяет сертификат и обнаруживает, что используемый мной сертификат не соответствует имени домена, для которого зарегистрирован (это сертификат веб-хостинга, зарегистрированный для домена веб-хостинга, а не домена, которым я владею, единственная причина, по которой я использую https) Это для защиты данных для внутренних целей, я не хочу, чтобы этот сайт посещался пользователями извне, поэтому этот сертификат должен быть в порядке).
Есть две вещи, которые я просто не понимаю о коде и обо всем.
- Ни один код, который мне удалось найти, не использует распечатки или сертификаты MD5/SHA-1 (предположительно, открытые ключи для шифрования сообщений?), Они просто каким-то образом автоматически подключаются к веб-сайту https и должны работать. Не работает для меня, хотя
- Мне действительно нужны те отпечатки md5/sha-1, которые мне предоставлены? Или, по крайней мере, что в данном контексте означают эти отпечатки?
Редактировать:
После данного ответа и дублирования оценки мне удалось заставить его работать - в том смысле, что я могу общаться с приложением за https. Но мне не пришлось использовать какой-либо вид md5/sha1. Как я узнаю теперь, что это безопасно? Есть ли этот протокол самостоятельно? Как будто эта связь защищена в любом случае, когда я использую встроенные классы Java для подключения к приложению за https?
Я, вероятно, не ищу точного технического объяснения, но скорее для гарантии того, что да - связь безопасна, даже если я не использую (сознательно) открытый ключ сертификата / сервера для шифрования своих сообщений. Что это делает соединение SSL для меня.