4

イントラネット Web アプリケーションにシングル サインオン機能を実装するために、中央認証システム (jasig.org) に取り組んでいます。同じマシン (Windows) で実行されている 2 つの tomcat インスタンスがあります。両方の tomcat インスタンスは、SSL を使用するように構成されており、自己署名証明書 (Java keytool を使用して作成) を使用しています。

Tomcat1

カスサーバー。

サーバー.xml

<Connector port="8443" maxHttpHeaderSize="8192" SSLEnabled="true"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
           keystoreFile="C:/Users/sandip.paul/.keystore"
           keystorePass="changeit"
           truststoreFile="C:/Program Files/Java/jdk1.6.0_20/jre/lib/security/cacerts" />

Tomcat2

myWebApp (春のセキュリティを使用)

サーバー.xml

<Connector port="8663" maxHttpHeaderSize="8192" SSLEnabled="true"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />

以下は、myWebApp の applicationContext-security.xml ファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:security="http://www.springframework.org/schema/security"
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">

    <!--
        Enable security, let the casAuthenticationEntryPoint handle all intercepted urls.
        The CAS_FILTER needs to be in the right position within the filter chain.
    -->
    <security:http entry-point-ref="casProcessingFilterEntryPoint" auto-config="true">
        <security:intercept-url pattern="/protected/**" access="IS_AUTHENTICATED_FULLY" />
    </security:http>

    <!--
        Required for the casProcessingFilter, so define it explicitly set and
        specify an Id Even though the authenticationManager is created by
        default when namespace based config is used.
    -->
    <security:authentication-manager alias="authenticationManager" />

    <!--
        This section is used to configure CAS. The service is the
        actual redirect Client URL that will be triggered after the CAS login sequence.
    -->
    <bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties">
        <property name="service" value="https://obll1973.abc.com:8663/myWebApp/j_spring_cas_security_check"/>
        <property name="sendRenew" value="false"/>
    </bean>

    <!-- 
        The customUserDetailsService provides ROLE & other Details and 
        create an object of UserDetail for this application.
    -->
    <bean id="customUserDetailsService"
        class="edu.sandip.cas.client.authentication.CustomUserDetailsService">
    </bean>

    <!-- 
        The CasProcessingFilter has very similar properties to the 
        AuthenticationProcessingFilter (used for form-based logins).

        The CAS Processing filter handles the redirect from the CAS server 
        and starts the ticket validation.
    -->
    <bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter">
        <security:custom-filter after="CAS_PROCESSING_FILTER"/>
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="authenticationFailureUrl" value="/casfailed.jsp"/>
        <property name="defaultTargetUrl" value="/"/>
    </bean>

    <!--
        The entryPoint intercepts all the CAS authentication requests.
        It redirects to the CAS loginUrl for the CAS login page.
    -->
    <bean id="casProcessingFilterEntryPoint" 
        class="org.springframework.security.ui.cas.CasProcessingFilterEntryPoint">
        <property name="loginUrl" value="https://obll1973.abc.com:8443/cas/login"/>
        <property name="serviceProperties" ref="serviceProperties"/>
    </bean>

    <!-- 
        Handles the CAS ticket processing.
    -->
    <bean id="casAuthenticationProvider" 
        class="org.springframework.security.providers.cas.CasAuthenticationProvider">
        <security:custom-authentication-provider />
        <property name="userDetailsService" ref="customUserDetailsService" />
        <property name="serviceProperties" ref="serviceProperties" />
        <property name="ticketValidator">
            <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
                <constructor-arg index="0" value="https://obll1973.abc.com:8443/cas" />
            </bean>
        </property>
        <property name="key" value="an_id_for_this_auth_provider_only"/>    
    </bean>

    <!-- 
        To access request.getRemoteUser() from client application  
    -->
    <bean id="wrappingFilter" class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter" />
</beans>

私が直面している問題は、以下の例外です。

java.lang.RuntimeException: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:341)
    org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:305)
    org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:50)
    org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:207)
    org.springframework.security.providers.cas.CasAuthenticationProvider.authenticateNow(CasAuthenticationProvider.java:145)
    org.springframework.security.providers.cas.CasAuthenticationProvider.authenticate(CasAuthenticationProvider.java:131)
    org.springframework.security.providers.ProviderManager.doAuthentication(ProviderManager.java:188)
    org.springframework.security.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:46)
    org.springframework.security.ui.cas.CasProcessingFilter.attemptAuthentication(CasProcessingFilter.java:94)
    org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:258)
    org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
    org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
    org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
    org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
    org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:236)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)

上記の例外を複製する手順: 1) https://obll1973.abc.com:8663/myWebApp/protected/を使用して myWebApp にアクセスしようとし ました 2) cas サーバー、つまりhttps://oll1973.abc.comにリダイレクトされています。 8443/cas/loginおよびユーザー名/パスワードの提供後 ここでは、生成されたトークンを検証するために myWebApp が再度 cas サーバーに要求を送信すると例外がキャッチされます。

提案/ヘルプは非常に高く評価されます。

4

1 に答える 1

8

Spring-CAS 構成は正常に見えます。

SSLHandshakeExceptionが表示される唯一の理由は、作成されたキーストアまたは JVM キーストアへの SSL キーの不適切なインポートが原因です。

キーの作成中に、次のことを行いましたか

注 : CN であるエイリアス名 (ここでは cas) は、マシンのホスト名と同じ名前にする必要があります。

マシンのホスト名を見つけるには、コンソールまたはコマンド プロンプトで、引用符なしで「ホスト名」と入力します。

app という名前のルートの下にディレクトリを作成します

[root@localhost アプリ]# keytool -genkey -alias cas -keyalg RSA -keystore .cas -storepass caspasswd

あなたの姓名は何ですか? [不明]: cas あなたの組織単位の名前は何ですか? [不明]: MYCOMPANY あなたの組織の名前は何ですか? [Unknown]: MYCOMPANY あなたの都市または地域の名前は? [不明]: バンガロール あなたの州または県の名前は何ですか? [不明]: Karnataka このユニットの 2 文字の国コードは? [不明]: IN CN=cas、OU=MYCOMPANY、O=MYCOMPANY、L=バンガロール、ST=カルナタカ、C=IN は正しいですか? [いいえはい

Enter key password for (上記のパスワードを入力 -- この場合は caspasswd ) (キーストアのパスワードと同じ場合は RETURN): 新しいパスワードを再入力します。

[root@localhost app]# keytool -exportcert -alias cas -file cas.crt -keystore .cas Enter keystore password: Certificate stored in file

[root@localhost アプリ]# ls cas.crt ソフトウェア test.class test.java tomcat7027CAS

[root@localhost app]# keytool -import -alias cas -file cas.crt -keystore /app/softwares/jdk1.6.0_27/jre/lib/security/cacerts キーストアのパスワードを入力してください: 所有者: CN=cas, OU=MYCOMPANY , O=MYCOMPANY, L=Bangalore, ST=Karnataka, C=IN 発行者: CN=cas, OU=MYCOMPANY, O=MYCOMPANY, L=Bangalore, ST=Karnataka, C=IN シリアル番号: 510a6a63 有効期限: Thu Jan 31 18:28:11 IST 2013 まで: Wed May 01 18:28:11 IST 2013 証明書フィンガープリント: MD5: 52:8E:2E:74:C6:57:CD:B3:B0:B6:6C:17:D9 :0D:77:F3 SHA1: 1F:AA:4C:22:B9:16:DC:AA:D4:87:07:CF:DD:B2:11:A6:AE:36:9A:DB 署名アルゴリズム名: SHA1withRSA バージョン: 3 この証明書を信頼しますか? [いいえ]: はい 証明書がキ​​ーストアに追加されました

[root@localhost アプリ]# keytool -list -keystore /app/softwares/jdk1.6.0_27/jre/lib/security/cacerts -alias cas キーストアのパスワードを入力してください: cas、2013 年 1 月 31 日、trustedCertEntry、証明書フィンガープリント (MD5) : 52:8E:2E:74:C6:57:CD:B3:B0:B6:6C:17:D9:0D:77:F3

[root@localhost アプリ]#

また、Tomcat server.xml 内では、次のように https コネクタも使用します。

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" keystoreFile="/app/.cas" keystorePass="mykeypassword" 
    secure="true" connectionTimeout="240000" 
               clientAuth="false" sslProtocol="TLS" allowUnsafeLegacyRenegotiation="true" />
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8069" protocol="AJP/1.3" redirectPort="8443" />

上記のキーは CAS サーバー用でした。アプリケーション用に独自の個別のキーを作成できます。

ただし、両方のキーを JVM cacerts キーストアにインポートする必要があります (方法については後述します)。

ここで最も重要な部分: CAS サーバーのエイリアス名が cas であるとします。

アプリケーション サーバーのエイリアス名は myapp です

JVM にインポートするために、両方のサーバーで cas.crt と myapp.crt の両方のキーを保持します。

両方のサーバーで次の操作を行います。

1) keytool -import -alias cas -file /app/cas.crt -keystore /usr/java/jdk1.5.0_22/jre/lib/security/cacerts

2) keytool -import -alias myapp -file /app/cas.crt -keystore /usr/java/jdk1.5.0_22/jre/lib/security/cacerts

確認するには、次のコマンドを使用します --

1) keytool -list -v -keystore /usr/java/jdk1.5.0_22/jre/lib/security/cacerts -alias cas

2) keytool -list -v -keystore /usr/java/jdk1.5.0_22/jre/lib/security/cacerts -alias myapp

Java の複数のバージョンを使用している場合は、Java--JRE--LIB--SECURITY--CACERTS ファイルについて確認してください。

これにより、エラーが削除されます。

ノート :

適切なユーザー資格情報を入力した後、ブラウザーに空白のページが表示される場合は、システムのホスト ファイル (Linux では /etc/hosts、Windows では c:\windows\system32\driver\etc\hosts) を変更します。

そこにcasサーバーのIPを追加します

例えば。

162.25.250.60 マイアプリ 162.25.250.81 cas

どんな疑問も解消できます。

以下を参照できます。

https://wiki.jasig.org/display/CASUM/SSL+トラブルシューティング+and+リファレンス+ガイド

于 2013-02-12T09:19:31.553 に答える