2016-05-25 12 views
0

私はsamlでスプリングブートセキュリティのサンプルプログラムを変更しようとしています。 https://github.com/vdenotaris/spring-boot-security-saml-sample。私のアイデンティティプロバイダから証明書(.crt)を取得し、アプリケーションに統合する前に接続をテストするためのサンプルキーストア(.jks)を作成しようとしました。 以下の手順に従って証明書を作成しました。別名mykeyを持つSAMLキーに秘密鍵がありません

私は私のキーストアを一覧表示しようとすると、私は私が提供する証明書をインポートしたキーストア

keytool -list -V -storepass changeit -keystore mykeystore.jks 

ザ・リスト1の秘密鍵

を持って

keytool -keystore mykeystore.jks -genkey -alias saml 

キーストアを作成します。次のコマンドを使用してIDPチームによって作成されます。私は私のJKSファイルを一覧表示する際

keytool -import -file myidp.crt -storepass changeit -keystore mykeystore.jks

は、今私は2つのエントリのプライベート1を持っている私。

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 2 entries 

Alias name: saml 
Creation date: May 24, 2016 
Entry type: PrivateKeyEntry 
XXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXX 
******************************************* 
******************************************* 
Alias name: mykey 
Creation date: May 24, 2016 
Entry type: trustedCertEntry 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
******************************************* 
******************************************* 

私は、キーストアにCRTのインポート中に、私は任意のパスフレーズを与えていない、WebSecurityConfi.javaクラスを変更しました。エイリアス名は同じにしておこうとしましたが、エラーが発生しました。

keytool error: java.lang.Exception: **Public keys in reply and keystore don't match

@Bean 
    public KeyManager keyManager() { 
     DefaultResourceLoader loader = new DefaultResourceLoader(); 
     Resource storeFile = loader.getResource("classpath:/saml/myKeystore.jks"); 

     String storePass = "changeit"; 
     Map<String, String> passwords = new HashMap<>(); 
     passwords.put("changeit", "changeit"); 
     String defaultKey = "mykey"; 
     return new JKSKeyManager(storeFile, storePass, passwords, defaultKey); 
    } 

今、私は例外の下に取得しています、私はそれが私のJKSの作成といくつかの問題である知っています。信頼できるストアの秘密鍵を追加する方法を教えてください。私はIDPプロバイダから.crtファイルしか受け取らなかった。信頼できるストアの秘密鍵を追加するために他の手順を実行する必要がありますか?私はKey with alias xxx doesn't have a private key with Spring SAMLのようなポストを私の問題に似たものにチェックしましたが、証明書の作成に関する問題を理解することができません。

ERROR [http-nio-8080-exec-4] (DirectJDKLog.java:182) - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.lang.RuntimeException: Key with alias mykey doesn't have a private key at org.springframework.security.saml.metadata.MetadataGenerator.getServerKeyInfo(MetadataGenerator.java:209) at org.springframework.security.saml.metadata.MetadataGenerator.buildSPSSODescriptor(MetadataGenerator.java:329) at org.springframework.security.saml.metadata.MetadataGenerator.generateMetadata(MetadataGenerator.java:189) at org.springframework.security.saml.metadata.MetadataGeneratorFilter.processMetadataInitialization(MetadataGeneratorFilter.java:127) at org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:86) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) DEBUG [http-nio-8080-exec-4] (DispatcherServlet.java:861) - DispatcherServlet with name 'dispatcherServlet' processing GET request for [/error] DEBUG [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:318) - Looking up handler method for path /error DEBUG [http-nio-8080-exec-4] (AbstractHandlerMethodMapping.java:325) - Returning handler method [public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)] DEBUG [http-nio-8080-exec-4] (AbstractBeanFactory.java:251) - Returning cached instance of singleton bean 'basicErrorController' DEBUG [http-nio-8080-exec-4] (DispatcherServlet.java:947) - Last-Modified value for [/error] is: -1 DEBUG [http-nio-8080-exec-4] (AbstractMessageConverterMethodProcessor.java:225) - Written [{timestamp=Tue May 24 19:12:00 IST 2016, status=500, error=Internal Server Error, exception=java.lang.RuntimeException, message=Key with alias mykey doesn't have a private key, path=/favicon.ico}] as "application/json;charset=UTF-8" using [org.springfr[email protected]380682cd] DEBUG [http-nio-8080-exec-4] (DispatcherServlet.java:1034) - Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling

+0

[キーストア内の秘密鍵と署名された証明書との間のリンク](http://stackoverflow.com/questions/23238337/link-between-private-key-and-signed-certificate-in-keystoreの可能性のある重複) – EJP

答えて

0

署名付き証明書を秘密鍵と同じエイリアスを使用してインポートする必要があります。

Now my when I list my jks file I have two entries, one private

あなたは1つしか持っていないはずです。

+0

私はそれを試みましたが、次に私はエラーの下になっています。 keytoolエラー:java.lang.Exception:応答とキーストアの公開鍵が一致しません – Harry

+0

次に、KeyStoreまたは間違ったエイリアスまたは間違った証明書があります。あなたはエイリアスを持っていた鍵ペアから始めました。あなたは同じエイリアスからCSRを生成しました:あなたはCSRから署名された証明書を取得しました。署名付き証明書を同じ別名を持つ同じKeyStoreにインポートする必要があります。 – EJP

-1

キーストアには任意の数の秘密鍵エントリを置くことができますが、秘密鍵は1つしか設定できません。プライベートキーはEntry type: PrivateKeyEntry ..のタイプで、春のセキュリティを更新してください。 xmlは秘密鍵のエイリアスを持ちます。例えば。

<!-- Central storage of cryptographic keys --> 
      <bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> 
       <constructor-arg value="classpath:keycloak.jks"/> 
       <constructor-arg type="java.lang.String" value="password"/> 
       <constructor-arg> 
        <map> 
         <entry key="YOUR_ALIAS" value="password"/> 
        </map> 
       </constructor-arg> 
       <constructor-arg type="java.lang.String" value="YOUR_ALIAS"/> 
      </bean> 
関連する問題