Jak naprawić błąd „java.security.cert.CertificateException: Brak tematu alternatywne nazwy występuje”?
Mam klienta usługi WWW Java, który korzysta z usługi internetowej za pośrednictwem protokołu HTTPS.
import javax.xml.ws.Service;
@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
extends Service
{
public ISomeService() {
super(__getWsdlLocation(), ISOMESERVICE_QNAME);
}
Kiedy łączę się z adresem URL usługi (https://AAA.BBB.CCC.DDD:9443/ISomeService
), Dostaję wyjątekjava.security.cert.CertificateException: No subject alternative names present
.
Aby to naprawić, najpierw pobiegłemopenssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt
i dostał następujące treści w plikucerts.txt
:
CONNECTED(00000003)
---
Certificate chain
0 s:/CN=someSubdomain.someorganisation.com
i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Session-ID-ctx:
Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Key-Arg : None
Start Time: 1382521838
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
---
AFAIK, teraz muszę
wyodrębnić częśćcerts.txt
pomiędzy-----BEGIN CERTIFICATE-----
i-----END CERTIFICATE-----
,zmodyfikuj go, aby nazwa certyfikatu była równaAAA.BBB.CCC.DDD
inastępnie zaimportuj wynik za pomocąkeytool -importcert -file fileWithModifiedCertificate
(gdziefileWithModifiedCertificate
jest wynikiem operacji 1 i 2).Czy to jest poprawne?
Jeśli tak, to w jaki sposób mogę wykonać certyfikat z kroku 1 z dodatkiem opartym na protokole IP (AAA.BBB.CCC.DDD
)?
Aktualizacja 1 (23.10.2013 15:37 MSK): W odpowiedzi na apodobne pytanie, Czytam:
Jeśli nie masz kontroli nad tym serwerem, użyj jego nazwy hosta (pod warunkiem, że istnieje przynajmniej CN odpowiadający tej nazwie hosta w istniejącym certyfikacie).
Co dokładnie oznacza „używać”?