Wie behebt man den Fehler "java.security.cert.CertificateException: No subject alternative names present"?
Ich habe einen Java-web service-client einen web service nutzt, via 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);
}
Wenn ich eine Verbindung an die Dienst-URL (https://AAA.BBB.CCC.DDD:9443/ISomeService
), bekomme ich die exception java.security.cert.CertificateException: No subject alternative names present
.
Um es zu beheben, ich lief zuerst openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt
und habe folgenden Inhalt in der Datei certs.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, jetzt muss ich
- extrahieren Sie die Teil
certs.txt
zwischen-----BEGIN CERTIFICATE-----
und-----END CERTIFICATE-----
, - ändern Sie es so, dass der name des Zertifikats entspricht
AAA.BBB.CCC.DDD
und - importieren Sie dann das Ergebnis mit
keytool -importcert -file fileWithModifiedCertificate
(wofileWithModifiedCertificate
ist das Ergebnis der Operationen 1 und 2).
Ist das richtig?
Wenn ja, wie genau kann ich das Zertifikat aus Schritt 1 arbeiten mit IP-Basis-Adresse (AAA.BBB.CCC.DDD
) ?
Update 1 (23.10.2013 15:37 MSK): In einer Antwort auf eine ähnliche Fragelese ich Folgendes:
Wenn du nicht in der Steuerung, server, verwenden Sie dessen host-Namen (sofern
dass es mindestens eine CN-passende, die host-Namen in das bestehende
cert).
Was genau bedeutet "benutzen"?
InformationsquelleAutor der Frage DP_ | 2013-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe das problem behoben durch die Deaktivierung der HTTPS-Prüfungen mit dem Ansatz vorgestellt hier:
Lege ich folgenden code in die
ISomeService
Klasse:Da bin ich mit der
https://AAA.BBB.CCC.DDD:9443/ISomeService
nur für Testzwecke, es ist eine ausreichend gute Lösung.InformationsquelleAutor der Antwort DP_
Ich habe das gleiche problem und gelöst mit diesem code.
Ich habe diesen code vor dem ersten Aufruf meines webservices.
Es ist einfach und funktioniert gut.
Hier ist die original-Quelle.
InformationsquelleAutor der Antwort juanmhidalgo
Die Verifizierung des Zertifikats Identität durchgeführt wird, gegen das, was die client-Anfragen.
Wenn Ihr client verwendet
https://xxx.xxx.xxx.xxx/something
(woxxx.xxx.xxx.xxx
ist eine IP-Adresse), wird das Zertifikat die Identität überprüft diese IP-Adresse (in der Theorie, nur über eine IP-SAN-Erweiterung).Wenn Ihr Zertifikat hat keine IP-SAN, aber DNS-SANs (oder, wenn kein DNS-SAN, einen Gemeinsamen Namen im Subject DN), können Sie diese arbeiten, indem Sie Ihre client-benutzen Sie eine URL mit, dass die host-Namen anstelle (oder einen host-Namen, für die das Zertifikat gültig, wenn es mehrere mögliche Werte). Zum Beispiel, wenn Sie das US-cert hat einen Namen für
www.example.com
verwendenhttps://www.example.com/something
.Natürlich, müssen Sie die host-Namen zu lösen, dass die IP-Adresse.
Außerdem, wenn es irgendwelche DNS-SANs, die CN im Subject DN ignoriert werden, so verwenden Sie einen Namen, der mit einem der DNS-SANs in diesem Fall.
InformationsquelleAutor der Antwort Bruno
Import das cert:
openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt
Dies wird extrahieren Sie Zertifikate im PEM-format.openssl x509 -in certs.txt -out certs.der -outform DER
sudo keytool -importcert -file certs.der -keystore <path-to-cacerts>
Standard-cacerts-Passwort ist 'changeit'.Wenn das Zertifikat ist ausgestellt für einen FQDN und Sie versuchen, eine Verbindung von IP-Adresse in Ihrem Java-code, dann sollte das wohl behoben werden, die in Ihrem code statt messing mit Zertifikat selbst. Ändern Sie Ihren code, um die Verbindung durch den FQDN. Wenn FQDN nicht aufgelöst werden kann, auf Ihre dev-Maschine, einfach fügen Sie es Ihrer hosts-Datei, oder konfigurieren Sie Ihre Maschine mit DNS-server, kann diesen Namen auflösen.
InformationsquelleAutor der Antwort AndreyT
Können Sie nicht wollen, deaktivieren Sie alle ssl-Verificatication und so können Sie einfach deaktivieren Sie die "hostName verification" über diese, die ist ein bisschen weniger beängstigend, als die alternative:
[BEARBEITEN]
Erwähnt conapart3
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
ist jetzt veraltet, so dass es entfernt werden kann in einer späteren version, so dass Sie möglicherweise gezwungen sein, in die Zukunft zu Rollen Sie Ihre eigenen, obwohl ich würde immer noch sagen, ich würde Steuern Weg von Lösungen, wo alle die Verifikation ausgeschaltet ist.InformationsquelleAutor der Antwort lifesoordinary
mein problem mit dem abrufen dieser Fehler wurde behoben indem die vollständige URL "qatest.ourCompany.com/webService" statt nur "qatest/webService". Grund war, dass unser Sicherheits-Zertifikat hatte eine wildcard, d.h. "*.ourCompany.com". Wenn ich die vollständige Adresse der Ausnahme ging Weg. Hoffe, das hilft.
InformationsquelleAutor der Antwort Shahriar
Ich habe das Problem gelöst, indem auf die folgende Weise.
1. Erstellen einer Klasse . Die Klasse hat einige leere Implementierungen
2. Erstellen Sie eine Methode
InformationsquelleAutor der Antwort Aditya Bhuyan
Fügen Sie Ihre IP-Adresse in der hosts-Datei.die ist im Ordner C:\Windows\System32\drivers\etc.
Auch hinzufügen von IP-und Domain-Namen der IP-Adresse.
Beispiel:
aaa.bbb.ccc.ddd [email protected]
InformationsquelleAutor der Antwort Prakash Soni