Насколько я понимаю, в большинстве случаев это исключение указывает, что владелец сертификата CN (общее имя) не совпадает с именем хоста в URL-адресе. Однако в моем случае они совпадают, но исключение до сих пор вызывает ..Почему я получаю «Не найдено совпадение имен» CertificateException?
удаленный сертификат иерархия сервера:
- самозаверенный сертификат с
CN=sms.main.ru
- сертификат, подписанный с первым и
CN=client.sms.main.ru
Мой Java-клиент запускается под Apache-Tomcat 6 и пытается подключиться к https://client.sms.main.ru/
и следующее исключение:
No name matching client.sms.main.ru found
Оба сертификата добавляются в $JAVA_HOME/jre/lib/security/cacerts
с помощью $JAVA_HOME/bin/keytool
, как показано на How do you configure Apache/Tomcat to trust internal Certificate Authorities for server-to-server https requests в ответ по unixtippse.
Java-код довольно тривиальна:
URL url = new URL(strurl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Connection", "close");
con.setDoOutput(true);
con.connect();
Что мне не хватает?
Интересно то, что когда я пытаюсь открыть URL с помощью браузера на ПК с Windows, это говорит о том, что сертификат не является доверенным, я добавляю его в список исключений браузера и она отлично работает. Похоже, что я добавил эти сертификаты в cacerts
неправильно, так что java не может их использовать. Но я могу легко найти их по псевдониму или CN с:
$JAVA_HOME/bin/keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | less
, если он самоподписан, тогда ему не будет доверять, так как иерархия не пройдет до TA –
@Scary Wombat. Но я добавил их обоих в 'cacerts'..and отметил их там как надежные .. Этого недостаточно? Разве это не так, как нужно, чтобы доверять самозаверяющему сертификату? – horgh
Вы используете неправильный класс для доступа к https – CharlieS