- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个在 Ubuntu 16.04.3 服务器和开发环境中运行的 Web 应用程序,我有一个在 Apache2.0.48 下生成和配置的自签名 X509 证书。这一切都很好。
我在构建脚本中用于生成 X509 的示例命令如下:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /var/www/ssl/selfSigned.key -out /var/www/ssl/selfSigned.crt -subj "/C=US/ST=California/L=Somewhere/O=SomeGroup/OU=SomeOU/CN=192.168.0.150"
证书问题
我最近在我的应用程序中引入了一个第 3 方 JAVA 应用程序(显然是 Spring 框架),并且我一直在努力将它集成到我的应用程序中。他们的支持团队在让事情在 HTTP 环境中工作方面表现出色,并指导我使用 this link 使用自签名 X509 在 HTTPS 下设置 Spring 应用程序。
我用如下更改更新了我的 application.properties 文件:
server.port=8181
security.require-ssl=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=/var/www/secure/ssl/keystore.p12
server.ssl.key-store-password=123456
server.ssl.key-alias=server1
使用简单的导入命令(按照链接上的 1.b)
keytool -import -keystore /var/www/ssl/keystore.p12 -storepass 123456 -noprompt -alias server1 -file /var/www/ssl/self-signed.crt
证书似乎已成功插入到 keystore 中,但是当我重新启动第 3 方服务以读取新参数时,我得到了这个
Jun 15 19:32:08 ubuntu java[7016]: ***************************
Jun 15 19:32:08 ubuntu java[7016]: APPLICATION FAILED TO START
Jun 15 19:32:08 ubuntu java[7016]: ***************************
Jun 15 19:32:08 ubuntu java[7016]: Description:
Jun 15 19:32:08 ubuntu java[7016]: The Tomcat connector configured to listen on port 8181 failed to start. The port may already be in use or the connector may be misconfigured.
Jun 15 19:32:08 ubuntu java[7016]: Action:
Jun 15 19:32:08 ubuntu java[7016]: Verify the connector's configuration, identify and stop any process that's listening on port 8181, or configure this application to listen on another por
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Main process exited, code=exited, status=1/FAILURE
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Unit entered failed state.
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Failed with result 'exit-code'.
我想知道它是否是证书,所以我决定使用 keytool 生成证书而不是 openssl(注意使用我更新我的 application.properties 以使用的测试 keystore ):
keytool -genkeypair -alias server1 -keyalg RSA -keysize 2048 -keystore /var/www/secure/ssl/test.p12 -storetype PKCS12 -validity 3650
当我使用它时,服务至少会启动(即使应用程序没有按预期工作)所以我只能假设证书需要转换。
谷歌搜索显示将我现有的证书从 PEM(我假设是 PKCS10 格式,因为我使用的是“req”?)转换为 PKCS12 相当简单,所以我尝试使用以下命令:
openssl pkcs12 -export -out certificate.pfx -inkey self-signed.key -in self-signed.crt
(我将导出密码留空,以免在服务重启时继续输入)。然后我获取我的新 PKCS12 证书并导入它(也注意到一个新的 keystore ):
keytool -import -keystore test2.p12 -storepass 123456 -noprompt -alias server1 -file certificate.pfx
但是该命令失败并出现 keytool 错误:java.lang.Exception:输入不是 X.509 证书
我也试过
openssl crl2pkcs7 -nocrl -certfile self-signed.crt -out self-signed.p7b
keytool -import -keystore test.p12 -storepass 123456 -noprompt -alias server1 -file self-signed.p7b
...并得到相同的错误(不是 X.509 证书)
我用谷歌搜索了如何将这些证书在各种格式之间转换为 keytool 可以使用的格式(并且服务正确启动),但我似乎陷入了一个永无止境的循环,没有进一步的进展。
从我最初看到的情况来看,我不认为第 3 方应用程序本身有任何问题,因为它在 HTTP 下运行得很好;将 HTTPS 添加到 Spring 似乎非常简单。我不是 JAVA 大师,所以我只能推测证书有问题。
谁能看出我错在哪里?
最佳答案
您混淆了两个不同的东西:一个证书,用于标识您信任的其他人(通常但不总是 CA = 证书颁发机构),以及一个证书加私钥,用于标识您自己(您自己的系统)。 SSL/TLS 服务器必须有证书和私钥。
keytool -import -keystore /var/www/ssl/keystore.p12 -storepass 123456 -noprompt -alias server1 -file /var/www/ssl/self-signed.crt
这仅适用于第一种情况,即识别您信任的其他人的证书。这对您的情况是无用且错误的。
Googling shows that it's reasonably simple to convert my existing certificates from PEM (PKCS10 format I assume, as I'm using "req"?) to PKCS12 so I try that with the following command:
openssl req
default 创建一个 CSR(证书签名请求),它是 PKCS10,但是你创建了一个 openssl req -x509
证书(不是 CSR),特别是自签名证书,在某些情况下,包括您的证书也会创建相应的私钥。证书和私钥都不是 PKCS10。证书是证书;对于相当新的 OpenSSL 并且由于您指定了 -nodes
(其拼写是历史遗迹,现在已经过时了)私钥是 PKCS8 未加密的(技术上 ASN.1 类型 PrivateKeyInfo
而不是 EncryptedPrivateKeyInfo
)。
openssl pkcs12 -export -out certificate.pfx -inkey self-signed.key -in self-signed.crt
你快到了。
(I leave the export password as blank so as not to keep having to type it in when services restart).
PKCS12 设计为始终使用密码加密,将密码留空是一种非标准情况,在 OpenSSL 和 Java 之间无法一致工作。但是您不需要在启动时输入任何内容,key-store-password
设置应该可以处理。
Then I take my new PKCS12 certificate and import it (noting a new keystore too):
keytool -import -keystore test2.p12 -storepass 123456 -noprompt -alias server1 -file certificate.pfx
那根本行不通。 -import
仅导入可信证书(到新条目),或 X.509、'PkiPath' 或 PKCS7 格式的证书链与现有私钥条目(通常是一个 在 Java 中生成)。它在任何情况下都不会导入 PKCS12 格式的文件。
PKCS12 已经是适合现代 Java 的 keystore 。如果你想将它转换为旧格式的 JKS keystore ,正如一些旧的 Java 系统或程序需要或更喜欢的那样,-importkeystore
可以做到这一点;查看手册或搜索数十个现有的问题。请注意,您使用后缀 pfx
命名了 PKCS12,但这并没有改变内容,无论如何出于实际目的 PFX 和 PKCS12 是同一件事。
返回 pkcs12 -export
并在您的服务器配置中使用密码。就个人而言,为了清楚起见,我也会使用以 p12
结尾的文件名,但任何与服务器配置匹配的名称都应该有效。
关于java - 转换 PEM 证书以在 JAVA Spring Framework 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882433/
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicates: What is a framework? What does it do? Why do we need a f
我在按照 http://msdn.microsoft.com/en-us/data/jj591621.aspx 处的 Microsoft Data Developer 过程启用代码优先迁移时遇到了一些
我正在从 迁移项目 Entity Framework 4.3 在 .net 4 上运行到 Entity Framework 5 在 .net 4.5 上运行。在不做任何更改的情况下,当我尝试运行该项目
我正在使用 Entity Framework 6 并使用 EntityFramework Extended 来执行一些批量更新和批量删除。批量更新和批量删除工作正常,但我还需要知道更新/删除的实体(即
我在实体上添加了一个列,然后从模型中生成数据库或构建解决方案,然后收到一条消息,提示我刚添加的新列未映射。该数据库以前是从模型创建的,没有错误。 当我右键单击Entity并选择Table Mappin
每次我尝试运行我的代码时都会崩溃,因为我尝试启动函数以调用 SDK 的任何部分。 我在构建过程中包含了 FoundationSDK: 并且我在头文件中包含了对 SDK 的引用: 但是每次我运行这个,我
我以前能够毫无问题地提交我的申请。我的工作流程中唯一改变的部分是使用 Sourcetree。在对以下框架进行更新后,我在提交到 iOS App Store 时收到此警告。我还收到一封电子邮件,其中包含
假设我为 Asp.NET Web 应用程序安装了 .NET Framework 2.0、3.0、3.5。 我意识到 Framework 3.0 和 3.5 只是 Framework 2 的扩展,不太清
是否有 SaveChanges 事件在保存更改后但在更新更改跟踪器之前触发? 我正在使用 EF 6。 我需要在某个实体的状态发生变化时执行任务。 我已经覆盖了 SaveChanges 来设置它。我可以
我正在使用一个现有的数据库,并且我已经将其中一个表映射为一个实体(因为我需要映射一个外键)。 因此,在初始化此数据库时,我希望 EF 忽略此实体,因为它已经存在。 我该怎么做? 最佳答案 您应该使用
我有 3 个表需要与 Entity Framework 进行映射,但我不确定解决此问题的正确方法。这是我的 3 个实体: public class User { [Key] public
我首先使用 VS 2010 和 Entity Framework 代码(版本 6)。我有两个实体,每个实体都在自己的上下文中,我想在它们之间创建一对多关系。 上下文 1 具有以下实体: public
我知道 EF 在 CodePlex 上是开源的,但我没有看到当前发布的 5.0 版本的分支。我在哪里可以得到这个源代码? 最佳答案 没有。他们只开源了 post 5 版本。第一次签到可能足够接近,但再
我们目前有一个数据库很大的系统,存储过程既用于CUD又用于查询。数据集用于从 SP 查询中检索结果。 现在我们正在研究使用 Entity Framework 针对同一个数据库开发另一个项目。在查询数据
我有一个每 10 秒运行一次的 Windows 服务......每次运行时,它都会获取一些测试数据,对其进行修改并使用 EntityFramework 将其保存到数据库中。但是,在每一秒运行时,当我尝
我对在我们的场景中仅将 Entity Framework 与存储过程一起使用的合理性有疑问。 我们计划拥有一个 N 层架构,包括 UI、BusinessLayer (BLL)、DataAccessLa
当我使用 Entity Framework 时,我想在上下文中查询出一条记录并将其添加到具有相同架构的另一个上下文中,在查询出记录后,我将其从上下文中分离出来,但是相关实体都没有了,是吗?有什么办法解
我正在使用 Entity Framework 5 构建 ASP.Net MVC4 Web 应用程序。我必须使用现有的 sql server 数据库,但也想使用 Code First,所以我遵循了本教程
在 Entity Framework 4.0 中使用 T4 模板创建 POCO 会丢失什么?为什么使用 Entity Framework 4.0 时的默认行为不创建 POCO? 最佳答案 你会失去很多
我在网上使用 Repository Pattern 和 EF 看了很多例子。但他们都没有真正谈到与相关实体的合作。 就像说用户可以有多个地址。 IUserRepository User CreateU
我是一名优秀的程序员,十分优秀!