当前位置: 首页 > 知识库问答 >
问题:

带有别名mykey的SAML-Key没有私钥

桓瀚
2023-03-14

我试图用saml修改spring boot安全性的一个示例程序。https://github.com/vdenotaris/spring-boot-security-saml-sample.我从身份提供者那里获得了证书(.crt),并尝试创建一个示例密钥库(.jks),以在集成到应用程序之前测试我的连接性。我按照以下步骤创建证书。

创建密钥存储

keytool -keystore mykeystore.jks -genkey -alias saml

当我试图列出我的密钥库时,我有一个私钥

列出密钥库

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

我使用下面的命令导入了IDP团队提供的证书。

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

现在,当我列出我的jks文件时,我有两个条目,一个是私有的。

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
*******************************************
*******************************************

我修改了WebSecurity配置。java类,在将crt导入密钥存储时,我没有给出任何密码短语。我试图保持别名不变,但后来我发现了以下错误。

keytools错误:java.lang.异常:**回复和密钥库中的公钥不匹配

  @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文件。我是否需要执行任何其他步骤来为我的受信任存储添加私钥?我检查了两个别名为xxx的类似post的密钥,但没有一个类似于我的问题的Spring SAML私钥,但我无法找出证书创建的问题。

错误[http-nio-8080-exec-4](DirectJDKLog.java:182)-Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发了异常。lang.RuntimeException:别名为mykey的密钥在org上没有私钥。springframework。安全山姆。元数据。元数据生成器。getServerKeyInfo(MetadataGenerator.java:209)位于org。springframework。安全山姆。元数据。元数据生成器。buildSPSSODescriptor(MetadataGenerator.java:329)位于org。springframework。安全山姆。元数据。元数据生成器。org上的generateMetadata(MetadataGenerator.java:189)。springframework。安全山姆。元数据。MetadataGeneratorFilter。processMetadataInitialization(MetadataGeneratorFilter.java:127)位于org。springframework。安全山姆。元数据。MetadataGeneratorFilter。doFilter(MetadataGeneratorFilter.java:86)位于org。springframework。安全网状物FilterChainProxy$VirtualFilterChain。doFilter(FilterChainProxy.java:330)位于org。springframework。安全网状物过滤链氧气。doFilterInternal(FilterChainProxy.java:213)位于org。springframework。安全网状物过滤链氧气。doFilter(FilterChainProxy.java:176)位于org。springframework。网状物滤器删除FilterProxy。在org上调用Legate(DelegatingFilterProxy.java:346)。springframework。网状物滤器删除FilterProxy。doFilter(DelegatingFilterProxy.java:262)位于org。阿帕奇。卡塔琳娜。果心应用过滤链。org上的internalDoFilter(ApplicationFilterChain.java:239)。阿帕奇。卡塔琳娜。果心应用过滤链。doFilter(ApplicationFilterChain.java:206)位于org。springframework。网状物滤器RequestContextFilter。doFilterInternal(RequestContextFilter.java:99)位于org。springframework。网状物滤器OncePerRequestFilter。doFilter(OncePerRequestFilter.java:107)位于org。阿帕奇。卡塔琳娜。果心应用过滤链。org上的internalDoFilter(ApplicationFilterChain.java:239)。阿帕奇。卡塔琳娜。果心应用过滤链。doFilter(ApplicationFilterChain.java:206)位于org。springframework。网状物滤器HttpPutFormContentFilter。doFilterInternal(HttpPutFormContentFilter.java:87)位于org。springframework。网状物滤器OncePerRequestFilter。doFilter(OncePerRequestFilter.java:107)位于org。阿帕奇。卡塔琳娜。果心应用过滤链。org上的internalDoFilter(ApplicationFilterChain.java:239)。阿帕奇。卡塔琳娜。果心应用过滤链。doFilter(ApplicationFilterChain.java:206)位于org。springframework。网状物滤器HiddenHttpMethodFilter。doFilterInternal(HiddenHttpMethodFilter.java:77)位于org。springframework。网状物滤器OncePerRequestFilter。doFilter(OncePerRequestFilter.java:107)位于org。阿帕奇。卡塔琳娜。果心应用过滤链。org上的internalDoFilter(ApplicationFilterChain.java:239)。阿帕奇。卡塔琳娜。果心应用过滤链。doFilter(ApplicationFilterChain.java:206)位于org。springframework。网状物滤器字符编码过滤器。doFilterInternal(CharacterEncodingFilter.java:121)位于org。springframework。网状物滤器OncePerRequestFilter。doFilter(OncePerRequestFilter.java:107)位于org。阿帕奇。卡塔琳娜。果心应用过滤链。org上的internalDoFilter(ApplicationFilterChain.java:239)。阿帕奇。卡塔琳娜。果心应用过滤链。doFilter(ApplicationFilterChain.java:206)位于org。阿帕奇。卡塔琳娜。果心标准包装阀。在org上调用(StandardWrapperValve.java:212)。阿帕奇。卡塔琳娜。果心标准连接阀。在org上调用(StandardContextValve.java:106)。阿帕奇。卡塔琳娜。验证者。AuthenticatorBase。在org上调用(AuthenticatorBase.java:502)。阿帕奇。卡塔琳娜。果心标准阀门。在org上调用(StandardHostValve.java:141)。阿帕奇。卡塔琳娜。阀门。打开阀门。在org上调用(ErrorReportValve.java:79)。阿帕奇。卡塔琳娜。果心标准引擎版本。在org上调用(StandardEngineValve.java:88)。阿帕奇。卡塔琳娜。连接器。郊狼适应者。服务(CoyoteAdapter.java:521)位于org。阿帕奇。郊狼。http11。抽象Http11处理器。进程(AbstractHttp11Processor.java:1096)位于org。阿帕奇。郊狼。AbstractProtocol$AbstractConnectionHandler。org上的进程(AbstractProtocol.java:674)。阿帕奇。公猫util。网NioEndpoint$SocketProcessor。doRun(NioEndpoint.java:1500)位于org。阿帕奇。公猫util。网NioEndpoint$SocketProcessor。在java上运行(NioEndpoint.java:1456)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)。util。同时发生的ThreadPoolExecutor$Worker。在org上运行(ThreadPoolExecutor.java:617)。阿帕奇。公猫util。线程。TaskThread$wrappingranable。在java上运行(TaskThread.java:61)。朗。丝线。运行(Thread.java:745)调试[http-nio-8080-exec-4](DispatcherServlet.java:861)-名为'DispatcherServlet'的DispatcherServlet处理获取调试请求[http-nio-8080-exec-4](AbstractHandlerMethodMapping.java:318)-查找路径/错误调试的处理程序方法[http-nio-8080-exec-4](AbstractHandlerMethodMapping.java:325)-返回处理程序方法[public org.springframework.http.ResponseEntity]

共有2个答案

燕砚文
2023-03-14

您的密钥库中可以有任意数量的私钥项。。。但您只能为spring saml配置一个私钥。。。私钥的类型应为条目类型:PrivateKeyEntry。。更新你的Spring安全。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>
梁丘安晏
2023-03-14

您需要使用与私钥相同的别名导入签名证书。

现在,当我列出我的jks文件时,我有两个条目,一个是私有的

你应该只有一个,二等兵。

 类似资料:
  • 我正在尝试测试这个示例应用程序(https://github.com/deeprot/spring-saml-adfs),这是一个简单的Spring SAML示例应用程序,在我的环境中,因此,我有以下错误: 严重:在具有路径 [/Spring安全性 -saml2-样本] 的上下文中,为 Servlet.service() 抛出异常 java.lang.运行时异常:别名为 XXXX 的密钥没有私钥

  • 我正在尝试下载我在几个密钥库中的证书,包括它们的私钥。通过Azure Portal,我可以在没有问题的情况下进行操作,只需进入密钥库,选择证书并点击“PFX/PEM格式下载”。 由于我必须在几个钥匙库上重复相同的操作,我正在寻找一种自动化的方法来完成它。到目前为止,我得出以下结论:

  • 问题内容: 基本上,我想知道在使用带有或不带有外键的REFERENCES之间的区别。 我有以下两个示例: 范例2: 我要问的是,为什么第二个示例为什么使用FOREIGN KEY关键字,而第一个示例仅使用REFERENCES。 另外,第一个似乎引用了自己(我认为Employees中的s是一个错误)。如果是这样,如果引用自己,为什么要使用REFERENCES? 问题答案: 恭喜你!您偶然发现了MySQ

  • 我在RestController中对一个实体使用QuerydslPredicate,它有一个date对象,我希望能够查询给定日期之前/之后/之间的日期,希望有类似的东西 null

  • 我尝试用OKTA为Spring应用程序设置SAML,我遵循http://developer.okta.com/code/java/spring_security_saml.html. 完成教程中的所有步骤后,我得到以下错误 SEVERE: Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2

  • 我正在使用Mac上的ssh-keygen生成的公钥/私钥设置文件到服务器的SFTP传递。我生成的私钥看起来与代码库中的其他私钥不同(它没有标头,是“OpenSSH私钥”而不是“RSA私钥”)。