1

Ich versuche, meinen Apache Tomcat Server so einzurichten, dass SSL über die gesamte Site funktioniert und die Client/Server-Authentifizierung in einem Teil der Site erzwungen wird. Der Kunde hat mir seine Stammzertifizierungsstelle (in .crt-Form) für die Vertrauensstellung angegeben. Sie verwenden ihr Client-Zertifikat, um eine Verbindung mit https://<site>/sso/login herzustellen, und bei der Authentifizierung sollte die Site ihnen erlauben, REST-konform mit diesem Teil zu interagieren.Tomcat w/SSL, Client/Server Auth auf Teil der Website

Zunächst einmal, ich bin mit Apache Tomcat 6. Ich habe eine Website, die SSL mit dem folgenden Stecker in server.xml verwenden eingerichtet ist:

<Connector port="443" SSLEnabled="true" maxThreads="16" 
      protocol="org.apache.coyote.http11.Http11NioProtocol" 
      scheme="https" secure="true"clientAuth="want" 
      sslProtocol="TLS" keystoreFile="C:\ssl\keystore" 
      keystorePass="***" truststoreFile="C:\ssl\keystore" 
      truststorePass="***" 
      /> 

Dies sollte bedeuten, dass ich SSL auf dem gesamten will Website, wird aber Clientzertifikate "wollen". (Clientzertifikate werden für den Teil der Site benötigt, der beim Öffnen einer SSO-Verbindung hilft.) Und tatsächlich funktioniert SSL gut. Ich habe ein GoDaddy-signiertes SSL-Zertifikat im Keystore.

Für den SSO Teil mit Client Credential Bedürfnissen, zurück zu server.xml, ich bin mit einem Speicher Reich:

<Realm className="org.apache.catalina.realm.MemoryRealm" /> 

So, das in tomcat-users.xml, die ich verwenden kann:

<role rolename="sso"/> 
<user username="CN=***, OU=***, C=**" password="null" roles="sso"/> 

. .. wobei der Benutzername mit den DN-Informationen des Kundenzertifikats übereinstimmt. (Hat Abstand in der Benutzername Materie?)

Und in web.xml:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>SSO</web-resource-name> 
     <url-pattern>/sso/login</url-pattern> 
    </web-resource-collection> 

    <auth-constraint> 
     <role-name>sso</role-name> 
    </auth-constraint> 

    <user-data-constraint> 
     <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    </user-data-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>CLIENT-CERT</auth-method> 
</login-config> 

<security-role> 
    <role-name>sso</role-name> 
</security-role> 

Schließlich habe ich den Kundenstammzertifizierungsstelle zu keystore hinzugefügt mit

"%JAVA_HOME%\bin\keytool" 
    -import 
    -alias customer_root 
    -keystore "C:\ssl\keystore" 
    -trustcacerts 
    -file "C:\ssl\customer_root.crt" 
    -storepass "***" 

Hier ist mein Dilemma ist. .. Wenn sie auf die https://<site>/sso/login gehen, ist die Client-Authentifizierung versucht, aber sie erhalten einen HTTP 401-Fehler. Also, ich habe etwas falsch gemacht.

Um die Sache schwieriger zu machen, kann der Kunde mir keine weiteren Informationen über die Authentifizierung auf seiner Seite als "HTTP 401" geben.

Ich habe viele, viele Quellen durchlaufen, um selbstsignierte CA-Schlüssel mit autorisierten Clientschlüsseln einzurichten und zu erstellen, die ich über einen Java-Client zu verwenden versuchte, den ich für den Zweck, zu dem eine Verbindung hergestellt wird, codiert habe die Website und POST zu ~/sso/login, aber jedes Mal, wenn ich re-code/re-package/re-run Tests I auch erhalten ein HTTP 401, anstatt in der Lage sein, mindestens einmal zu verbinden.

Also, entweder ich Tomcat falsch eingerichtet, oder ich nicht die CA des Kunden richtig einrichten, aber ich kann nicht herausfinden, was, auch durch die Codierung meines eigenen Clients. Ich bin ratlos.

Sieht irgendetwas darüber falsch aus? Fehle ich ein Stück Konfiguration?

Antwort

0

Die Antwort gefunden, für jeden, der kommt und braucht die Informationen.

In der Konfigurationsdatei tomcat-users.xml ...

<role rolename="sso"/> 
<user username="CN=***, OU=***, C=**" password="null" roles="sso"/> 

Sollte haben kein Passwort von "null", sondern ein Passwort von ""

<role rolename="sso"/> 
<user username="CN=***, OU=***, C=**" password="" roles="sso"/>