Avatar billede sunlock Nybegynder
28. juli 2005 - 14:44 Der er 35 kommentarer og
1 løsning

Java, SOAP og certificater?

Jeg har en webservice som har en wsdl - vha axis har jeg fået lavet locator og stub-fil. Nu skal jeg så tilgå denne service, men den kræver verifikation i form af ssl (altså skal jeg sende et certificat til dem).

Hvordan får jeg det smidt ind? Lidt kode ville være brand godt :-)
Avatar billede arne_v Ekspert
28. juli 2005 - 14:54 #1
skal du sende er client certfikat

eller skal du bare acceptere server certifikat
Avatar billede sunlock Nybegynder
28. juli 2005 - 15:39 #2
Jeg har et certifikat og skal sende det til serveren.
Avatar billede arne_v Ekspert
28. juli 2005 - 20:35 #3
Jeg har aldrig prøvet det.

Måske Simon har ...
Avatar billede simonvalter Praktikant
29. juli 2005 - 02:01 #4
ikke før idag.

Klienten
-----------------------
Sæt System properties for trustStore og keyStore samt password, trustStorePassword defaulter til keyStorePassword så det behøver du ikke sætte hvis de er ens. trustStore/keyStore skal pege på det Klient Keystore som jeg beskriver længere nede.


String[][] props = {
            {"javax.net.ssl.trustStore", "/Users/simonvalter/ServerKeyStore.jks" },
          {"javax.net.ssl.keyStore", "/Users/simonvalter/ServerKeyStore.jks"},
            {"javax.net.ssl.keyStorePassword", "changeit" },
        };
        for (int i = 0; i < props.length; i++)  {
            System.getProperties().setProperty(props[i][0], props[i][1]);
        }


endpoint skal pege på https://url:port

Serveren
--------------------
Jeg går ud fra du ikke styrer serversiden men her er hvordan du laver private og public keys. Keystore og Keys password skal være ens.

Simon:~ simonvalter$ keytool -genkey -alias tomcat -keyalg RSA -keystore ServerKeyStore.jks 
Enter keystore password:  changeit
What is your first and last name?
  [Unknown]:  Simon valter
..
Is CN=Simon valter, OU=SuperUsers, O=SuperUsers, L=Copenhagen, ST=Copenhagen, C=DK correct?
  [no]:  yes

Enter key password for <tomcat>
        (RETURN if same as keystore password):  changeit


Exporter public key til et certifkat.

Simon:~ simonvalter$ keytool -export -alias tomcat -file ClientCertificate.cer -keystore ServerKeyStore.ks -storepass changeit
Certificate stored in file <ClientCertificate.cer>


Importer public key ind i klientens keystore

Simon:~ simonvalter$ keytool -import -trustcacerts -alias tomcat -file ClientCertificate.cer -keystore ClientKeyStore.ks -storepass changeit
Owner: CN=Simon valter, OU=SuperUsers, O=SuperUsers, L=Copenhagen, ST=Copenhagen, C=DK
Issuer: CN=Simon valter, OU=SuperUsers, O=SuperUsers, L=Copenhagen, ST=Copenhagen, C=DK
Serial number: 42e9613a
Valid from: Fri Jul 29 00:50:34 CEST 2005 until: Thu Oct 27 00:50:34 CEST 2005
Certificate fingerprints:
        MD5:  7B:49:07:E6:A5:F2:2E:F2:CC:F3:5C:5D:CA:06:A4:7F
        SHA1: 5D:22:42:EE:C5:73:67:9E:E5:80:2C:5F:44:F7:C0:0B:9C:C5:CA:D2
Trust this certificate? [no]:  yes
Certificate was added to keystore


Det sidste er også på server siden... i dette eksempel er det tomcat..

  <Connector port="8443" maxHttpHeaderSize="8192"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
              enableLookups="true" disableUploadTimeout="true"
              acceptCount="100" scheme="https" secure="true"
              clientAuth="true" sslProtocol="TLS"
              keystoreFile="/Users/simonvalter/ServerKeyStore.jks" keystorePass="changeit"
              truststoreFile="/Users/simonvalter/ServerKeyStore.jks"/>


Hvis clientAuth er sat til true så skal klienten sende et certificat til serveren for at få adgang. Det vigtige er trustStoreFile og keyStoreFile og password hvor tomcat default bruger "changeit"

Jeg sad fast et stykke tid her da jeg ikke have fat i den nyeste dokumentation for tomcat hvor truststoreFile er dokumenteret så jeg blev ved med at få en invalid_certificate og ældre læse stof om emnet heller ikke har nævnt den.

Sad iøvrigt også et par timer for at få axis til at virke da max os x af en eller anden grund loader nogen 3D .jnilib filer fra /System/Library/Java/Extensions der smider en zip exception .. sjovt hva ;(


Hvis det slet ikke er det som du efterspørger så må du gå lidt mere i detaljer. Hvem er server, hvilken type certifikat osv.
Avatar billede simonvalter Praktikant
29. juli 2005 - 02:03 #5
Det kan iøvrigt godt være at Keystore og Keys password ikek skal være ens men det er hvad jeg er stødt på flere steder..
Avatar billede sunlock Nybegynder
29. juli 2005 - 08:38 #6
Takker - prøver lige at kigge på det :-)
Avatar billede sunlock Nybegynder
29. juli 2005 - 13:13 #7
Det ser meget rigtigt ud, men jeg får følgende fejl tilbage (fra soap/ssl handshake-delen):
No trusted certificate found

Har du en ide til hvad det kan være?
Avatar billede simonvalter Praktikant
29. juli 2005 - 18:48 #8
nej.. ikke ud over at dine keystores ikke indeholder et certifikat.. du har både et på klient og et på server siden ikke?
ellers må du fortælle hvordan det du har lavet afviger fra det jeg gør
Avatar billede sunlock Nybegynder
29. juli 2005 - 21:23 #9
Jeg er ikke sikker på hvad jeg har på server-siden. Jeg tilgår en soap-service (betalingsservice) hos en server, som tager et certifikat og checker at jeg har adgang til soap-servicen. Til testing har jeg bare fået at vide at jeg skal lave et certifikat hos fx verisign.com - det har jeg så gjort. Men jeg får svaret fra server-siden at den ikke kan finde et certifikat i httpservlet kaldet...?
Avatar billede arne_v Ekspert
29. juli 2005 - 21:26 #10
snakker vi kryptering & signatur med HTTPS (transport niveau) eller WSS (message niveau) ?
Avatar billede simonvalter Praktikant
29. juli 2005 - 21:37 #11
Hvem er den betalingsservice hos? De må have noget dokumentation liggende vi kan kigge på.
Avatar billede sunlock Nybegynder
29. juli 2005 - 21:52 #12
Det er https. Det dokumentation der findes er (kort fortalt):
Til development acceptere de blot et certifikat (fx trial fra verisign.com).
Til produktion skal det være et trusted certifikat som fx dem man kan betale for hos verisign.

Det er det. Mit problem er at få certifikatet pakket ind i soap-kaldet. Der er deres dokumentation mangelfuld, og det virker ikke som om man kan få mere at vide...
Avatar billede arne_v Ekspert
29. juli 2005 - 22:03 #13
ved HTTPS skal certfikatet ikke ind i SOAP - HTTPS foregår på socket niveau -
cerfikat sendes under connection handshake

ved WSS indeholder SOAP messagen certifikat
Avatar billede sunlock Nybegynder
29. juli 2005 - 22:24 #14
Det skal nok passe - så godt er jeg slet ikke inde i soap og alt det her :-)
Nu er jeg desværre ikke på arbejde før mandag, men så skal jeg nok lige smide en kommentar med fejl-koden...
Men den skrev noget med connection handshake - men min hukommelse er ikke hvad den har været :-)
Avatar billede simonvalter Praktikant
30. juli 2005 - 02:14 #15
Jeg tror ikke det har noget med koden at gøre men nok nærmere noget at gøre med hvordan du har importeret certifikatet. Hvis du bare skal connecte til dem så skal du bare have CA Root certificate. Hvis du skal auth med certificat så i begge have SSL certificate + CA Root + muligivs secure site pro .. virker ikke her uden!

Først laver du din keystore.
keytool -genkey -alias mitcert -keyalg RSA -keystore keystore.jks

Ved First and Last name brug dit domæne det kommer til at køre under. Jeg bruger localhost her men du skal nok bruge noget i retning af ssl.server.dk bemærk at der er foreskel på server.dk og www.server.dk.

Du kan bruge dette i stedet.
-dname "cn=hostname, ou=None, L=Somewhere, ST=What, o=ExampleCom, c=DK"


Så laver du din CSR som skal submittes til verisign
keytool -certreq -sigalg MD5withRSA -file hostname.csr -keystore keystore.jks

Så får du tilsendt et certifikat

-----BEGIN CERTIFICATE-----
bla bla
-----END CERTIFICATE-----

gem dette i hostname.crt

hent trial ca root og gem det i root.crt

http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html


Hent http://www.verisign.com/support/verisign-intermediate-ca/secure-site-pro-intermediate/index.html
og gem det som ssp.crt

Det er ikke muligt at importere ssl cert endnu uden at få en exception så først disse:

keytool -keystore keystore.jks -keyalg RSA -import -trustcacerts -alias testcacert -file ssp.crt

keytool -import -keystore keystore.jks -keyalg RSA -import -trustcacerts -file root.crt -alias root


keytool -keystore keystore.jks -keyalg RSA -import -trustcacerts -file hostname.crt



Hvis det ikke virker nu så ved jeg ikke hvad det er.. jeg kører server og klient med hver deres verisign certifikat og det virker fint med clientauth slået til.
Avatar billede sunlock Nybegynder
01. august 2005 - 09:06 #16
No client certificate found in HttpServletRequest.

Det er hvad jeg får tilbage. Her er hvor det hele bliver sat:
-----
        String[][] props = {
            {"javax.net.ssl.trustStore", "c:\\end2end\\end2end.jks" },
            {"javax.net.ssl.keyStore", "c:\\end2end\\end2end.jks"},
            {"javax.net.ssl.keyStorePassword", "qwerty" },
            {"javax.net.ssl.trustStorePassword", "qwerty"},
            {"javax.net.debug", "all"}
        };

        for (int i = 0; i < props.length; i++)  {
            System.getProperties().setProperty(props[i][0], props[i][1]);
        }
-----

Jeg har checket at der egentlig ligger et certifikat i keystore, så det er heller ikke derfor. Kigger man i debug-koden kan man se at den kommer i kontakt med serveren - hvilket også giver mening med den fejl der bliver spyttet ud...
Avatar billede simonvalter Praktikant
01. august 2005 - 10:00 #17
Bare lige for en sikkerheds skyld så checkede jeg ved at køre det igennem en servlet og det virker også fint. Du må snart vise noget kode for ellers har jeg nok ikke mere at bidrage med.
Avatar billede sunlock Nybegynder
01. august 2005 - 10:44 #18
Hvad for noget kode vil du gerne se?
Avatar billede sunlock Nybegynder
01. august 2005 - 11:09 #19
Er din soap-message underskrevet med et certifikat?
Avatar billede simonvalter Praktikant
01. august 2005 - 11:14 #20
Nej det her foregår kun på transport niveau. Ja og jeg ved ikke rigtigt hvad jeg vil se. den servlet måske og koden hvor du kalder servicen.. den generede stub er det ligemeget med. En shell og adgang til den rigtige webservice går jeg ud fra er udelukket da det er i forbindelse med arbejde men det ville gøre det en del nemmere ;)
Avatar billede sunlock Nybegynder
01. august 2005 - 11:21 #21
Hmm, okay... Eftersom fejlen er "no client certificate found in HttpServletRequest" går jeg ud fra at den skal ind i soap-message.

Ja, desværre kan jeg ikke give dig url'en på webservicen, men jeg kan sige at "the certificate is used in a layered security system to authenticate the client attempting to use the service".
Avatar billede simonvalter Praktikant
01. august 2005 - 11:28 #22
Jeg kan bare ikke se hvad HttpServletRequest har med det her at gøre.. det er begrænset hvad jeg har beskæftiget mig med det her men jeg forestiller mig at webservice kaldet af fuldstændigt uafhængigt af en servlet. Du har skrevet koden selv, eller genereret den med wsdl2java og så kan du kalde den fra servlet eller lade være.. det burde ikke gøre nogen foreskel... så hvorfor nævner den httpservletrequest?
Avatar billede sunlock Nybegynder
01. august 2005 - 11:33 #23
Jeg har brugt axis til at auto-gen servlet'en, og ved ikke hvorfor den siger det. Det er bare det svar jeg får tilbage som messge...
Avatar billede sunlock Nybegynder
01. august 2005 - 14:39 #24
Efter længere tids søgen er jeg kommet frem til at den nu ikke godkender certifikatet, men smider:
-----
org.apache.xml.security.signature.XMLSignatureException: No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl
Original Exception was org.apache.xml.security.signature.XMLSignatureException: No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl
-----
Avatar billede simonvalter Praktikant
01. august 2005 - 15:06 #25
Prøv lige engang at sætte Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

kan du ikke også køre en
keytool -list -keystore ditkeystore
og paste her så jeg kan se hvad du har idet.
Avatar billede simonvalter Praktikant
01. august 2005 - 15:13 #26
Og prøv engang at slå denne system property til.. det giver måske noget

{"javax.net.debug","ssl"}
Avatar billede sunlock Nybegynder
01. august 2005 - 15:15 #27
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); ændre ikke noget...

Her kommer keystore:
-----
end2endkey, 01-08-2005, keyEntry,
Certificate fingerprint (MD5): 91:A0:8A 2:39:07:99:31:CD:BC 6:5A:20:63:A5:F4
publickey, 01-08-2005, trustedCertEntry,
Certificate fingerprint (MD5): 91:A0:8A 2:39:07:99:31:CD:BC 6:5A:20:63:A5:F4
verisignroot, 01-08-2005, trustedCertEntry,
Certificate fingerprint (MD5): B6:9D:A4:40:52:02:50:0D 5:9C:E1:B8:4B:66:C4:AC
signedcertificate, 01-08-2005, trustedCertEntry,
Certificate fingerprint (MD5): 16:B3:7D:C9:08:83:E5:BF:E4:32:A1:91 4:B7:CE:7E
-----
Avatar billede simonvalter Praktikant
01. august 2005 - 15:43 #28
Hvad med debug hvad siger det... bare det første 10-15 init linjer

Jeg ved ikke om du har læst jsse guiden
f.eks http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#CodeExamples
Måske har vi overset noget.. jeg smutter i seng om lidt.. stod op igår men vender tilbage i nat ;)
Avatar billede sunlock Nybegynder
01. august 2005 - 16:05 #29
http://www.sunlock.dk/tmp/output.txt - den bliver fjernet igen på et tidspunkt

Der er hele outputtet. Bemærk at jeg har lige fjernet lidt små-ting, men ikke nogen som ændre forståelsen...
Avatar billede simonvalter Praktikant
01. august 2005 - 16:28 #30
Øhh længere oppe bruger du

  {"javax.net.ssl.trustStore", "c:\\end2end\\end2end.jks" },
og i output.txt siger den mykey som ikke er navnet på nogen af de keys du listede før.

Har du lavet det helt om..


Nu kan jeg se den siger
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found


Er du sikker på du kan få adgang med et test certifikat.. medmindre de også har instaleret test root ca så vil de jo ikke acceptere dig og så er det vel klart det ske?r. Hvordan det foregår den anden vej ved jeg ikke men dit test root ca kender vel heller ikke noget til deres rigtige certifikat.
Avatar billede sunlock Nybegynder
02. august 2005 - 08:33 #31
Jeg har ændret lidt frem og tilbage, derfor de to forskellige stores :-)

Mht root ca - tja, så ved jeg ikke. Nu venter jeg på at få et certifikat fra verisign (et købt) som så kan bruges. Det skulle gerne virke... Håber jeg da
Avatar billede sunlock Nybegynder
03. august 2005 - 13:18 #32
Så virker det langt om længe... :-)

Jeg tror fejlen lå i oprettelsen af certifikatet (vel også derfor der kom "no trusted certificate found").

Smid lige et svar hvis du vil ha nogle points :-)
Avatar billede simonvalter Praktikant
03. august 2005 - 13:28 #33
Ok det var da rart. Men hvad havde du gjort forkert de andre gange?
Du havde vel ikke startet forefra og slettet den første nøgle uden at lave ny csr og fået nyt certifikat.
Avatar billede sunlock Nybegynder
04. august 2005 - 08:26 #34
I stedet for verisign.com gik jeg ind på verisign.dk og fik lavet et "digital id til en sikker mail" - det var åbenbart noget bedre end det jeg fik lavet på verisign.com... Så i stedet for at sætte certifikatet på soap-message fik jeg en server til at lave en stunnel (stunnel.org) og satte denne til at vedhæfte certifikatet og vulla :-)
Avatar billede simonvalter Praktikant
04. august 2005 - 10:14 #35
Ja det var da en lidt anderledes løsning at bruge stunnel, jeg bruger det også til irc men havde ikke overvejdet det i denne forbindelse. Men bare det virker.
Avatar billede sunlock Nybegynder
05. august 2005 - 08:21 #36
Jeg kan nu tilføje at den anden måde også virker - der har åbenbart også været noget med mit keystore... Men begge dele virker fint.

Bruger man stunnel så laver man alm soap - bruger man keystore så er det et https-request man laver.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester