基于 WSO2 Carbon 的产品附带一个名为 wso2carbon.jks 的默认密钥库,该密钥库存储在/repository/resources/security 目录中。 此密钥库带有一个私钥/公钥对,可用于所有目的,例如加密敏感信息、通过 SSL 进行通信以及用于 WS-Security 中的消息加密/签名目的。 可以为产品中的所有目的使用一个新的密钥库,也可以为每个目的创建多个密钥库。
有两种方法可以为 WSO2 产品创建密钥库。 可以使用现有的公钥证书(CA 签名)生成密钥库,也可以在生成密钥库时创建公钥证书。
安全套接字层 (SSL) 是一种用于保护系统之间通信的协议。 该协议使用公钥、私钥和随机对称密钥来加密数据。 由于 SSL 在许多系统中广泛使用,因此可能已经存在可以重复使用的证书。 在这种情况下,可以使用现有的 CA 签名证书通过 OpenSSL 和 Java keytool 为 SSL 生成密钥库。
:::info 在 WSO2 产品中,密钥库和私钥必须具有相同的密码。 ::: 执行以下命令将信任链的条目导出到 .pfx 格式的密钥库中:
openssl pkcs12 -export -in <certificate file>.crt -inkey <private>.key -name "<alias>" -certfile <additional certificate file> -out <pfx keystore name>.pfx
keytool -importkeystore -srckeystore <pkcs12 file name>.pfx -srcstoretype pkcs12 -destkeystore <JKS name>.jks -deststoretype JKS
现在有了一个带有 CA 签名证书的密钥库。
手动签发过程见 :手动签发 SSL 证书
这里我们只有一个证书文件,执行这一步可以忽略 **二.2 的将证书导入密钥库 **操作
openssl pkcs12 -export -in calvinchan.crt -inkey calvinchan.key -name "calvinchan" -out calvinchan.pfx keytool -importkeystore -srckeystore calvinchan.pfx -srcstoretype pkcs12 -destkeystore calvinchan.jks -deststoretype JKS
可以按照本节中的步骤使用私钥和新的公钥证书创建新的密钥库。 将使用本机的 JDK 安装提供的 keytool。 请注意,为密钥库生成的公钥证书是自签名的。 因此,如果需要 CA 签名的公钥证书,则需要生成 CA 签名的证书并将其导入密钥库。 或者可以选择使用 CA 签名的公共证书生成新密钥库的选项。
备份原来的 jks 文件
cd /usr/local/wso2ei-6.7.0-SNAPSHOT/repository/resources/security cp client-truststore.jks client-truststore.jks.bak cp wso2carbon.jks wso2carbon.jks.bak
keytool -genkey -alias newcert -keyalg RSA -keysize 2048 -keystore newkeystore.jks -dname "CN=<testdomain.org>, OU=Home,O=Home,L=SL,S=WS,C=LK" -storepass mypassword -keypass mypassword
:::info
此命令将创建一个包含以下详细信息的密钥库:
密钥库名称:newkeystore.jks
公共证书别名:newcert
密钥库密码:mypassword
私钥密码:mypassword(必须与keystore密码相同)
:::
请注意,如果没有在上述命令中指定“-keypass”和“-storepass”的值,则会要求为“-storepass”(密钥库的密码)指定值。 作为最佳实践,使用密码生成器生成强密码。 然后将要求输入 -keypass 的值。 单击 Enter,因为我们需要密钥库和密钥的密码相同。 此外,如果没有为 -dname 指定值,您将被要求单独提供这些详细信息。
您现在拥有一个带有私钥和自签名公钥证书的密钥库(.jks 文件)。
示例,为 www.calvinchan.wso2.org 生成私钥库,密码为:CalvinChan20220801
keytool -genkey -alias calvinchan -keyalg RSA -keysize 2048 -keystore calvinchan.jks -dname "CN=www.calvinchan.wso2.org, OU=Home,O=Home,L=SL,S=WS,C=LK" -storepass CalvinChan20220801 -keypass CalvinChan20220801
现在,让我们看看如何为密钥库获取 CA 签名证书。 请注意,无需在每次需要添加 CA 签名证书时都创建新的密钥库。
首先,您需要为您的密钥库(.jks 文件)生成证书签名请求 (CSR)。 然后,此 CSR 文件可由证书颁发机构 (CA) 进行认证,CA 是颁发数字证书的实体。 这些证书证明公钥的所有权。
keytool -certreq -alias certalias -file newcertreq.csr -keystore newkeystore.jks
系统将要求您提供密钥库密码。 输入密码后,该命令会将 newcertreq.csr 文件输出到/repository/resources/security/ 目录。 这是您必须提交给 CA 的 CSR。
示例:为 calvinchan.jks 生成 calvinchan.csr
keytool -certreq -alias calvinchan -file calvinchan.csr -keystore calvinchan.jks
如果您希望部署多个子域,例如 gateway.sampledomain.org 、 publisher.sampledomain.org 、 identity.sampledomain.org 等,最好使用通配符证书或多个域证书。 对于此类要求,您必须通过添加主题备用名称来修改 CSR 请求。 大多数 SSL 提供程序都给出了在这种情况下生成 CSR 的说明。
CA (Comodo) 提供的样本证书
:::info
CA 的根证书:AddTrustExternalCARoot.crt
中间证书:COMODORSAAddTrustCA.crt、COMODORSADomainValidationSecureServerCA.crt
CA 签署的 SSL 证书:testsampleapporg.crt
:::
内网使用可以用 OpenSSL 手动签发 SSL 证书
cd /usr/local/wso2ei-6.7.0-SNAPSHOT/repository/resources/security/calvinchan mkdir ssl cd ssl openssl genrsa -des3 -out calvinchan.key 1024 openssl req -new -key calvinchan.key -out calvinchan.csr cp calvinchan.key calvinchan.key.org openssl rsa -in calvinchan.key.org -out calvinchan.key openssl x509 -req -days 365 -in calvinchan.csr -signkey calvinchan.key -out calvinchan.crt
示例,为 www.calvinchan.wso2.org 手动签发 SSL 证书,密码为:CalvinChan20220801,CN 应该填域名或者IP
按照下面给出的步骤将 CA 签名的证书导入您的密钥库。
keytool -import -v -trustcacerts -alias ExternalCARoot -file AddTrustExternalCARoot.crt -keystore newkeystore.jks -storepass mypassword keytool -import -v -trustcacerts -alias TrustCA -file COMODORSAAddTrustCA.crt -keystore newkeystore.jks -storepass mypassword keytool -import -v -trustcacerts -alias SecureServerCA -file COMODORSADomainValidationSecureServerCA.crt -keystore newkeystore.jks -storepass mypassword
可以附加 -storepass选项以避免稍后在交互模式下提示时输入密码。
keytool -import -v -alias newcert -file <test_sampleapp_org.crt> -keystore newkeystore.jks -keypass mypassword -storepass mypassword
在此命令中,使用您在创建密钥库时使用的相同别名(即“newcert”)
现在您有了一个 Java 密钥库,其中包括一个 CA 签名的公钥证书,可用于生产环境中的 SSL。 接下来,您可能需要将相同的 CA 签名公钥证书添加到 client-truststore.jks 文件。 这将为通过 SSL 的 WSO2 产品的后端通信/系统间通信提供安全性和信任。
在 SSL 握手中,客户端需要验证服务器提供的证书。 为此,客户端通常将其信任的证书存储在信任库中。 为了启用安全可信的后端通信,所有 WSO2 产品都附带一个名为 client-truststore.jks 的信任库,它与默认密钥库 (/repository/resources/security/) 位于同一目录中。
按照下面给出的步骤将相同的 CA 签名公钥证书(您在上一步中获得)导入 WSO2 产品的默认信任库 (client-truststore.jks)。
keytool -export -alias certalias -keystore newkeystore.jks -file <public key name>.pem
keytool -import -alias certalias -file <public key name>.pem -keystore client-truststore.jks -storepass wso2carbon
请注意,“wso2carbon”是默认 client-truststore.jks 文件的密钥库密码。
现在,您将 SSL 证书存储在 Java 密钥库中,并将公钥添加到 client-truststore.jks 文件中。 请注意,这两个文件都应位于/repository/resources/security/ 目录中。 现在,您可以通过更新产品中的相关配置文件,将产品中的默认 wso2carbon.jks 密钥库替换为新创建的密钥库。
keytool -export -alias calvinchan -keystore calvinchan.jks -file calvinchan.pem -storepass CalvinChan20220801 keytool -import -alias calvinchan -file calvinchan.pem -keystore /usr/local/wso2ei-6.7.0-SNAPSHOT/repository/resources/security/client-truststore.jks -storepass wso2carbon
创建新密钥库并更新 client-truststore.jks 文件后,必须更新一些配置文件才能使密钥库正常工作。 请注意,密钥库在 WSO2 产品中用于多种功能,包括验证通过 SSL/TLS 进行的通信、加密密码和配置文件中的其他机密信息等。因此,必须使用更新的密钥库信息更新特定的配置文件。 例如,您可能有单独的密钥库,用于加密配置文件中的密码,以及验证通过 SSL/TLS 进行的通信。
所有 WSO2 产品随附的 wso2carbon.jks 密钥库文件用作所有功能的默认密钥库。 但是,在生产环境中,建议使用新的密钥和证书创建新的密钥库。
请注意,在 WSO2 IoT Server 和 WSO2 Enterprise Integrator 中,/repository/conf 目录位于以下位置:/conf
如果您想要一种简单的方法来定位所有引用密钥库的配置文件,您可以使用 grep 命令,如下所示:
:::info
1、打开命令提示符并导航到产品存储所有配置文件的/repository/conf/ 目录。
2、执行以下命令:** grep -nr ".jks"**
列出了每个文件中引用的配置文件和密钥库文件
:::
WSO2 产品的主密钥库由 carbon.xml 文件中的 Keystore 元素配置(存储在/repository/conf/ 目录中)。 默认情况下,此密钥库用于 WSO2 产品中的以下功能。 :::info
加密/解密密码和其他机密信息,这些信息保存在各种配置文件以及内部数据存储中。 请注意,您还可以选择分离密钥库以加密内部数据存储中的信息。
WSO2 产品与外部方通信时对消息进行签名(例如 SAML、OIDC id_token 签名)。 ::: 默认配置如下所示
<KeyStore> <Location>${carbon.home}/resources/security/wso2carbon.jks</Location> <Type>JKS</Type> <Password>wso2carbon</Password> <KeyAlias>wso2carbon</KeyAlias> <KeyPassword>wso2carbon</KeyPassword> </KeyStore> <TrustStore> <!-- trust-store file location --> <Location>${carbon.home}/repository/resources/security/client-truststore.jks</Location> <!-- trust-store type (JKS/PKCS12 etc.) --> <Type>JKS</Type> <!-- trust-store password --> <Password>wso2carbon</Password> </TrustStore>
:::info
此功能可通过 2018 年 7 月 8 日发布的 WUM 更新 2792 获得,适用于以下产品版本:
WSO2 Identity Server 5.5.0
WSO2 API Manager 2.2.0
WSO2 Data Analytics Server 3.2.0
WSO2 Enterprise Integrator 6.2.0
这是新推出的加密服务的一部分。 它是一个可扩展的框架,有助于满足 WSO2 产品的加密需求。
:::
目前,由/repository/conf/carbon.xml 文件中的/元素配置的主密钥库用于内部数据加密(加密内部数据存储和配置文件中的数据)以及 用于签署与外部各方通信的消息。 但是,有时通常需要使用单独的密钥库来与外部方进行消息通信(例如 SAML、OIDC id_token 签名)以及对内部数据存储中的信息进行加密。 这是因为,对于第一种消息签名场景,需要经常更新密钥库证书。 但是,为了加密内部数据存储中的信息,密钥库证书不应该经常更改,因为每次证书更改时,已经加密的数据将变得不可用。
此功能允许您创建单独的密钥库以加密内部数据存储中的数据。 请按照以下说明进行操作。
:::danger
警告:在现有部署中使用全新的密钥库进行内部数据加密将使已经加密的数据无法使用。 在这种情况下,需要进行适当的数据迁移工作。
:::
<CryptoService> <Enabled>true</Enabled> <InternalCryptoProviderClassName>org.wso2.carbon.crypto.provider.KeyStoreBasedInternalCryptoProvider</InternalCryptoProviderClassName> <ExternalCryptoProviderClassName>org.wso2.carbon.core.encryption.KeyStoreBasedExternalCryptoProvider</ExternalCryptoProviderClassName> <KeyResolvers> <KeyResolver className="org.wso2.carbon.crypto.defaultProvider.resolver.ContextIndependentKeyResolver" priority="-1"/> </KeyResolvers> </CryptoService>
注意:密码等属性的值必须根据密钥库进行更改。
<InternalKeyStore> <Location>${carbon.home}/repository/resources/security/internal.jks</Location> <Type>JKS</Type> <Password>wso2carbon</Password> <KeyAlias>wso2carbon</KeyAlias> <KeyPassword>wso2carbon</KeyPassword> </InternalKeyStore>
存储在/repository/conf/tomcat/ 目录中的 catalina-server.xml 文件应使用用于验证与 Carbon 服务器的 SSL 连接的密钥库进行更新。 下面给出的是 catalina-server.xml 文件中的默认配置,它指向您产品中的默认密钥库。
keystoreFile="${carbon.home}/repository/resources/security/wso2carbon.jks" keystorePass="wso2carbon"
如果您使用 WSO2 API Manager (WSO2 APIM) 或 WSO2 Enterprise Integrator (WSO2 EI) 的 ESB,则需要更新 axis2.xml 文件中的密钥库信息(除了上面解释的 catalina-server.xml 文件) . 请注意,对于 APIM,axis2.xml 文件存储在/repository/conf/axis2/ 目录中,对于 WSO2 EI 的 ESB,存储在/conf/axis2/ 目录中。
<transportReceiver name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLListener"> <parameter name="keystore" locked="false"> <KeyStore> <Location>repository/resources/security/wso2carbon.jks</Location> <Type>JKS</Type> <Password>wso2carbon</Password> <KeyPassword>wso2carbon</KeyPassword> </KeyStore> </parameter> </transportReceiver>
<transportSender name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLSender"> <parameter name="keystore" locked="false"> <KeyStore> <Location>repository/resources/security/newkeystore.jks</Location> <Type>JKS</Type> <Password>mypassword</Password> <KeyPassword>mypassword</KeyPassword> </KeyStore> </parameter> </transportSender>
Java 安全管理器用于定义各种安全策略,以防止不受信任的代码操纵您的系统。 为 WSO2 产品启用 Java 安全管理器将激活/repository/conf/sec.policy 文件中的 Java 权限。 管理员可以修改此文件以根据需要更改 Java 安全权限,并为使用 Java 签名和受信任的代码授予各种应用程序级权限。
如果您授予某些已签名代码的特定 Java 级别权限,则应将签名者的公钥证书作为受信任证书导入您的密钥库之一。 然后,您必须使用密钥库路径和证书别名更新 sec.policy 文件,如下所示。
keystore "file:${user.dir}/repository/resources/security/wso2carbon.jks", "JKS";
以下是 sec.policy 文件中的默认密钥库配置,它授予使用“wso2carbon”别名的证书签名的代码的所有 Java 级别权限。
grant signedBy "wso2carbon" { permission java.security.AllPermission; };
如果在您的 WSO2 产品中实现了 WS-Security 场景,您可以为这些场景使用单独的密钥库。 WS-Security 用于 ESB 中的代理服务和数据服务。 有关为代理服务和数据服务应用安全策略的说明,请参阅 WSO2 Enterprise Integrator (WSO2 EI) 的文档。
1、手动签发 SSL 证书 openssl genrsa -des3 -out calvinchan.key 1024 openssl req -new -key calvinchan.key -out calvinchan.csr cp calvinchan.key calvinchan.key.org openssl rsa -in calvinchan.key.org -out calvinchan.key openssl x509 -req -days 365 -in calvinchan.csr -signkey calvinchan.key -out calvinchan.crt 2、把手动签发的 SSL 证书转换为 jks 密钥库 openssl pkcs12 -export -in calvinchan.crt -inkey calvinchan.key -name "calvinchan" -out calvinchan.pfx keytool -importkeystore -srckeystore calvinchan.pfx -srcstoretype pkcs12 -destkeystore calvinchan.jks -deststoretype JKS 3、将证书导入信任库或者在页面上传 keytool -export -alias calvinchan -keystore calvinchan.jks -file calvinchan.pem -storepass 123456 keytool -import -alias calvinchan -file calvinchan.pem -keystore wso2ei-6.7.0/repository/resources/security/client-truststore.jks -storepass wso2carbon
见:公网 CA 证书 和 将证书导入密钥库,把生成的 jks 证书导入信任库或者在页面上传