Fehler beim erstellen des service exception javax.xml.ws.WebServiceException:
Ich brauche verzweifelt Hilfe, um herauszufinden, warum mein Antrag nicht die Schaffung eines webservice.
Hier mein webservice Java-Klasse:
@WebService
@Component
public class LoginWs extends AbstractWs
{
private static final Logger logger=MiscUtils.getLogger();
@Autowired
private PersonDao personDao = null;
/**
* Returns PersonTransfer on valid login
* @throws NotAuthorisedException if password is incorrect
*/
public PersonTransfer login(String userNameOrEmailAddress, String password) throws NotAuthorisedException
{
Person person=personDao.findByUserNameOrEmailAddress(userNameOrEmailAddress, true);
if (person != null && person.checkPassword(password))
{
PersonTransfer personTransfer = PersonTransfer.getTransfer(person);
personDao.setLastLogin(person.getId(), new GregorianCalendar());
EventLogDao.logEvent(ActionType.READ_DATA.name(), "LoginWs.login()", "personId=" + person.getId());
return(personTransfer);
}
logger.debug("Login failed : u/p="+userNameOrEmailAddress+"/"+password);
throw(new NotAuthorisedException("Invalid Username/Password"));
}
}
Den code, der den Aufruf dieses Dienstes ist:
public static LoginWs getLoginWs()
{
LoginWsService service = new LoginWsService(buildURL("LoginService"));
LoginWs port = service.getLoginWsPort();
CxfClientUtils.configureClientConnection(port);
return(port);
}
Ausnahme wird geworfen :
LoginWsService service = new LoginWsService(buildURL("LoginService"));
Hier ist die volle Ausnahme:
Error
javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:65)
at javax.xml.ws.Service.<init>(Service.java:56)
at org.websr.my_server.ws.LoginWsService.<init>(Unknown Source)
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'https://192.168.2.184:8443/my_server/ws/LoginService?wsdl'.: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
Kann mir jemand sagen warum es nicht bei erstellen von Dienst selbst. In LoginWs Methode, diese Zeile
CxfClientUtils.configureClientConnection(port);
konfiguriert den SSL-Anschluss, aber mein code ist auch nicht immer da. Es versucht eine Verbindung herzustellen
LoginWsService service = new LoginWsService(buildURL("LoginService"));
und scheitern.
Kann mir bitte jemand sagen, was hier Los ist? Danke!
cert.pem:
MIID1DCCArygAwIBAgIJAPAlC2JvlPsZMA0GCSqGSIb3DQEBBQUAMIGSMQswCQYD
VQQGEwJDQTEQMA4GA1UECBMHT250YXJpbzEQMA4GA1UEBxMHVG9yb250bzERMA8G
A1UEChMISW5kaXZpY2ExETAPBgNVBAsTCEluZGl2aWNhMRYwFAYDVQQDEw0xOTIu
MTY4LjIuMTg0MSEwHwYJKoZIhvcNAQkBFhJkaXZ5YUBpbmRpdmljYS5jb20wHhcN
MTIwMTA2MTYxMTQwWhcNMTMwMTA1MTYxMTQwWjCBkjELMAkGA1UEBhMCQ0ExEDAO
BgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xETAPBgNVBAoTCEluZGl2
aWNhMREwDwYDVQQLEwhJbmRpdmljYTEWMBQGA1UEAxMNMTkyLjE2OC4yLjE4NDEh
MB8GCSqGSIb3DQEJARYSZGl2eWFAaW5kaXZpY2EuY29tMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEAxY8+fsw2pP4ToHN6XFNli4vOGbt+O/ANsr1A8iJh
nCb6cpQ58xF4pvYmETHrAUpv4zpi31SzZvWYI1tMaCEv9IpcX6Kc1B8NB9sLUnhR
gyblF37rZ7eMmSAXXeDS0CTtDEJoHOkGxoUdCN6N+vZjJ5+ZONiiuLqZ4x4HwBFr
ucIlwl2FkMMSxylg90tttSIyUHGz/p2DvNA2goYih4d89c/FLNpqwku+G3/gnL7U
l0OmNuFwJa/qMjy/V1orfpT8egxxh8DMp+fLAv1gjbeoizUs2bHo9kQSbUSp9Cwb
VDCol9jGI14cBuuEpWSANx2gTekN1ktoxztFPCh7H3OK/wIDAQABoyswKTAPBgNV
HREECDAGhwTAqAK4MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMA0GCSqGSIb3DQEB
BQUAA4IBAQALvpU0/5gQedlET2+r2MV0oksTmM2hV677yVsrOnGCOnTcgMZHp5i4
A0B24Ed2iDesX60OAViIocQkOiwYTRnubg5SoWyL1nhmaa/98U6M/re8R/bvq6OK
qrzEO6hHOtunJg1HcZDiJZop7R/pM52yRhRoXU6upZEhbPr6Eh+zfysA0TD6uMs7
9k2VeJo++XUvbG3dkVJ9kYhqfx2vC0HiMI4H2eomzl2ymS+R9Kg/9o29K8oCYjDI
jWPbl2hmf2cQuC4gG8GUDZi7zJkFsBuJpD6XgpIVK9zNhg1e89eP0nABupIFqBOI
iz0C+tRB4z4TezPL6yC7BDMY2nJ/Cg5e
vs, was der server ist eigentlich mit:
MIICVTCCAb6gAwIBAgIETr3AxTANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJD
QTEQMA4GA1UECBMHT250YXJpbzEQMA4GA1UEBxMHVG9yb250bzERMA8GA1UEChMI
SW5kaXZpY2ExETAPBgNVBAsTCEluZGl2aWNhMRYwFAYDVQQDEw0xOTIuMTY4LjIu
MTg0MB4XDTExMTExMjAwNDE0MVoXDTIxMTEwOTAwNDE0MVowbzELMAkGA1UEBhMC
Q0ExEDAOBgNVBAgTB09udGFyaW8xEDAOBgNVBAcTB1Rvcm9udG8xETAPBgNVBAoT
CEluZGl2aWNhMREwDwYDVQQLEwhJbmRpdmljYTEWMBQGA1UEAxMNMTkyLjE2OC4y
LjE4NDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzvnBMOM2YpM4Ch0MkesA
ryqX3YD8O22kJJrpRuOMyqgt6fKEDxkcGjiEZ7qLfWbzv3eX9DE0nVeS4m65Ucr2
LLZN6iZoqP8J+AmkSXKapIQpX7tZM5UuTDy82vUdOiYJELB3NSJc/4nkZkTaN8Uj
h3Ph366kRUP+QWiq2y97KKMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBFeOQOKq9u
4nq/IUgNpILrhcpiAP5LB49bCXeTCi8Ls51qUCaezceUQKrWM60a6w8FxQF+yopB
PSqGMrUBHnvewkThgZbS12t5vOEoXnWjOwiXhMhRsk5i9YUh1QCYfOFF23aXNfRu
NLL5svksUHm1IzBJJANnL/YdJHRrR0IEQg==
- Sie besitzen den server-code und der client code?Wie hast du das Zertifikat erstellt? Können Sie fügen Sie dem server-Zertifikat in der post?
- Gerade Hinzugefügt wurden. Ich habe die cert, indem Sie die folgenden Anweisungen in diesem link [crsr.net/Notes/SSL.html]
- Saphir: Überprüfen Sie meine Antwort
- Das Zertifikat, das Sie eingefügt haben in Ihrem letzten Bearbeiten nicht über eine SAN-Eintrag. Bitte überprüfen Sie ob Sie die richtige Zertifikat (siehe meine Antwort bearbeitet).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie eine Verbindung herstellen mit einer IP-Adresse direkt (und nicht um einen host-Namen) zu einem Zertifikat, das nicht mit einem Subject Alternative Name-Eintrag.
Dies ist natürlich im Zusammenhang mit dieser Frage:
Wenn Sie gewählt haben, nicht mit einem SAN-Eintrag, aber zu verlassen, ein einen host-Namen im CN - (was hast du auch so konfiguriert, zu lösen, um die richtige IP-Adresse in Ihrem client), müssen Sie es auch verwenden, um die Verbindung anzugeben. Ihre URL-generator ist wahrscheinlich eine URL, die immer noch verwendet die IP-Adresse.
EDIT: (Folgenden Kommentare)
Als ich sagte in der Antwort auf die andere Frage, die weiter oben verlinkt ist, gibt es (mindestens) zwei Möglichkeiten, erstellen ein selbst signiertes Zertifikat mit Subject Alt Name für Java:
keytool
Die Sie gewählt haben, die zweite option (vielleicht ein bisschen schwieriger?). OpenSSL in der Lage ist, eine PKCS#12-Datei (
.p12
), die die Standard-Java-security-Anbieter sollten in der Lage sein zu verwenden, da Sie eine keystore-direkt (obwohlkeytool
in Java 6 und höher ist in der Lage Umwandlung in einen JKS-Shop über-importkeystore
). Um Sie direkt zu benutzen, verwenden Sie die"PKCS12"
store geben.Bauen eine PKCS#12 Datei mit OpenSSL, mit dem Ergebnis des selbst-signierten Zertifikats generation (vorausgesetzt, die Dateien sind aufgerufen
cert.pem
für die cert undkey.pem
für den privaten Schlüssel):Dann konfigurieren Sie es im Apache Tomcat verwenden (und starten Sie Tomcat neu):
Extrahieren Sie den Inhalt des cert in der PKCS#12 Datei:
Überprüfen Sie das Zertifikat der server ist eigentlich mit:
IP
SAN-Eintrag statt einerDNS
eine (subjectAltName="IP:192.168.2.184"
)? Sie scheinen gegangen zu es der harte Weg:keytool
von Java 7 einfacher gewesen wäre. Mit OpenSSL, dann brauchen Sie zu bündeln, den private key und cert in einem keystore (obwohl es einfacher mit einemPKCS12
store-Typ).keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.keystore -srcstoretype pkcs12
. Nun, wie Sag ich Java, um zu sehen, in diesem keystore für das cert? Muss ich diesen Beitrag editieren von tomcat server.xml:Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/root/.keystore" keystorePass="dj650c" compression="on" compressionMinSize="2048" clientAuth="false" sslProtocol="TLS" />
server.pkcs12
Dateiserver.p12
(es ist die übliche Erweiterung). Nicht sicher, wie Ihre wörtliche Zitat oben ist, aber dein Ziel-keystore nicht/root/.keystore
. Sie nicht wirklich brauchen, um dies zu tun keytool-import/export. Zeigen Sie einfach IhrekeystoreFile=
zu Ihrer p12-Datei und verwenden SiekeystoreType="PKCS12"
in der connector-Konfiguration.openssl x509 -in cert.pem -noout -text
und sah, dass 192.168.2.184 ist aufgeführt unter SubjectAlternativeNames. Was bin ich? Ich bin so satt von diesem problem 🙁openssl s_client -connect 192.168.2.184:8443 -showcerts
Dem Zertifikat, das Sie gebucht haben, hat ein Problem.
Kann ich öffnen Sie es direkt über Windows, und ich Wette, wenn Sie öffnen Sie Internet Explorer, und geben Sie die web-service-URL und das Zertifikat anzeigen per DH Sie sollten keine Problem.
ABER aus irgendeinem Grund Java kann nicht analysiert werden.
Zum Beispiel, wenn ich versuche zu Lesen, das Zertifikat über Standard-java-Bibliotheken:
Bekomme ich analysieren Ausnahme:
Gibt es ein problem bei der Decodierung von base64.
Versuchen Hüpfburg es versäumt, es zu Lesen, wie gut.
Ich habe gesehen, bevor diese Diskrepanz zwischen Sicherheits-Bibliotheken und Windows sind in der Lage, zu decodieren, die Zertifikate während der Java-Bibliotheken können nicht.
In Ihrem Fall, Ihr Zertifikat kann nicht analysiert werden, indem Sie Ihre web-service-client verwendet java die exception geworfen von CXF-Wrapper hat die missleading-Nachricht über alternative Antragstellernamen.
Kann ich nicht sagen, was ist das problem mit Ihrem Zertifikat, weil ich bin nicht sehr vertraut mit open ssl.
Aber wenn Sie (nur um zu überprüfen, was ich sage:) eine neue keystore von java-tools, die Sie sollten kein problem haben.
.der
es sei denn, Sie konvertiert haben, in DER-format (in dem Fall ist es wahrscheinlich der Grund, warum es nicht funktioniert, da das X. 509-Zertifikat-Fabrik ist nur dokumentiert, für PEM-format).server.p12
zum Beispiel in meiner Antwort). Dann nehmen Sie nur das Zertifikat (ohne den privaten Schlüssel) entweder aus der PEM-Datei, oder extrahieren Sie es wieder aus der PKCS#12-Datei und importieren Sie es in Ihrem Vertrauen Speicher auf dem client.openssl genrsa -out key.pem 2048
undopenssl req -new -x509 -key key.pem -out cert.pem -days 365
auf 184 und get-cert.pem von 184 und fügen Sie es $JAVA_HOME/jre/lib/cacerts-store auf 188 (myclient) ?wget https://192.168.2.184/myserver/ws
- ist es wieder sagen: die Verbindung zu 192.168.2.184:443... fehlgeschlagen: Connection refused.)openssl genrsa, req, pkcs12 ...
(d.h. die PKCS12-keystore mit Ihrer selbst-signiertes Zertifikat für 192.168.2.184 und seinen privaten Schlüssel) sollte auf dem server. Das gleiche cert (aber das cert nur, d.h.cert.pem
) sollte dann kopiert werden, auf dem client-Rechner importiert und in Ihren trust store (cacerts
wenn Sie möchten, ändern Sie die Standard trust store ja auch).https://192.168.2.184:8443/.....
. Beachten Sie, dass, wenn es funktioniert in einem browser, es bedeutet nicht, dass es zur Arbeit zu gehen, in Java. Java implementiert RFC 2818 s-Prüfung (insbesondere IP-SANs, siehe Abschnitt 3.1) streng, in der Erwägung, dass einige Browser sind ziemlich nachsichtig.keytool -import -alias 192.168.2.184 -keystore $JAVA_HOME/jre/lib/security/cacerts -file cert.pem
) ich habe tomcat server.xml auf der server-Maschine für Punkt-zu-Keystore.p12 und Neustart von tomcat auf beiden Maschinen. Jetzt bin ich immer das Sonne.Sicherheit.validator.ValidatorException: PKIX path building failed: sun.Sicherheit.Anbieter.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target-trustedcacerts
. Ist Ihr server mit dem richtigen Zertifikat jetzt wenigstens?echo "" | openssl s_client -showcerts -connect hostname_or_ip_address:port
mir gibt. Bitte werfen Sie einen Blick.