我正在一个我继承的网站上工作。该网站是在Spring与嵌入式Tomcat服务器。它正在为HTTPS使用一个.jks文件。SSL证书已经过期,我正在尝试从Godaddy收到的文件中创建一个ne .jks文件。有一份文件说明了如何去做,但是缺少了一些东西。
These are the steps in document to create .jks file:
Security Settings
C:\trash\keyproc>openssl req -new -newkey rsa:2048 -nodes -keyout website_name_here.key -out website_name_here.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:XX
State or Province Name (full name) [Some-State]:XXXXX
Locality Name (eg, city) []:XXXX
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXXXX
Organizational Unit Name (eg, section) []:Software Development
Common Name (e.g. server FQDN or YOUR name) []:website_name_here.co
Email Address []:xxxxx@gmail.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:pwd_here
An optional company name []:xxxxx
Two files are generated website_name_here.key & website_name_here.csr
Use website_name_here.csr generated to get certificate from Godaddy.
Get SSL cetrificate from Godaddy and extract to this folder.
#################### Java Version 17 was active from hereon #################################################################
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\trash\keyproc>keytool -importkeystore -deststorepass pwd_here -destkeystore website_name_here.jks -srckeystore website_name_here.p12 -srcstoretype PKCS12
Importing keystore website_name_here.p12 to website_name_here.jks...
Enter source keystore password:
Entry for alias website_name_here.co successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore website_name_here.jks -destkeystore website_name_here.jks -deststoretype pkcs12".
C:\trash\keyproc>
After this just import main CRT file not bundle file using keytool.
在上述步骤中没有提到website_name_here.p12文件来自何处。可能是什么?
使用.jks文件的代码如下所示:
import lombok.SneakyThrows;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.util.Optional;
//@Profile("dev")
@Component
public class TomcatEmbedServerCustomConfiguration implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>
{
private static final Logger logger = LoggerFactory.getLogger(TomcatEmbedServerCustomConfiguration.class);
IWebApplicationServerSettingsRepository appSettinsRepository;
ApplicationHttpsSettingsEntityRepository applicationHttpsSettingsEntityRepository;
public TomcatEmbedServerCustomConfiguration(IWebApplicationServerSettingsRepository appSettinsRepository, ApplicationHttpsSettingsEntityRepository applicationHttpsSettingsEntityRepository)
{
this.appSettinsRepository = appSettinsRepository;
this.applicationHttpsSettingsEntityRepository = applicationHttpsSettingsEntityRepository;
}
@SneakyThrows
@Override
public void customize(TomcatServletWebServerFactory factory)
{
logger.info("Setting the Tomcat specific configurations. started");
try
{
Optional<WebApplicationServerSettingEntity> serverSettingEntity = appSettinsRepository.findById(1);
if (serverSettingEntity.isPresent())
{
factory.setPort(serverSettingEntity.get().getPort().getPORT());
factory.setAddress(InetAddress.getByName(serverSettingEntity.get().getHost()));
}
factory.setServerHeader("Server header of tomcat");
// HTTPS Settings - Begin
Optional<ApplicationHttpsSettingsEntity> applicationHttpsSettingsEntity = applicationHttpsSettingsEntityRepository.findById(1);
if(applicationHttpsSettingsEntity.isPresent())
{
logger.info("Setting HTTPS settings....");
if(applicationHttpsSettingsEntity.get().getUseHttps() !=0)
{
factory.addAdditionalTomcatConnectors(createSslConnector());
factory.addContextCustomizers(context ->
{
logger.info("Setting HTTPS settings....setting...");
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
logger.info("Setting HTTPS settings....setting...Done");
});
}
logger.info("Setting HTTPS settings....End");
}
// HTTPS Settings - end
logger.info("Tomcat Server Configuration Host=[" + factory.getAddress() + "] Port=[" + factory.getPort() + "]");
logger.info("Setting the Tomcat specific configurations. ended");
}
catch (Exception e)
{
logger.error(e.getMessage());
throw e;
}
}
// HTTPS Settings - Begin
private Connector createSslConnector() {
Optional<ApplicationHttpsSettingsEntity> applicationHttpsSettingsEntity = applicationHttpsSettingsEntityRepository.findById(1);
if(applicationHttpsSettingsEntity.isPresent())
{
logger.info("Creating SSL Connector...");
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// File keystore = new ClassPathResource("website_name.jks").getFile();
// File truststore = new ClassPathResource("keystore").getFile();
connector.setScheme("https");
connector.setSecure(applicationHttpsSettingsEntity.get().getUseHttps() != 0);
connector.setPort(applicationHttpsSettingsEntity.get().getBroadcaster().getPORT());
protocol.setSSLEnabled(applicationHttpsSettingsEntity.get().getUseHttps() != 0);
// protocol.setKeystoreFile("file:///c://trash//website_name_here.jks");
protocol.setKeystoreFile(applicationHttpsSettingsEntity.get().getKeyStore());
// protocol.setKeystorePass("pwd_here");
protocol.setKeystorePass(applicationHttpsSettingsEntity.get().getKeyStorePassword());
// protocol.setTruststoreFile(truststore.getAbsolutePath());
// protocol.setTruststorePass("changeit");
protocol.setKeyAlias(applicationHttpsSettingsEntity.get().getKeyAlias());
logger.info("Creating SSL Connector...Done");
return connector;
}
return null;
}
// HTTPS Settings - End
}
和
@Configuration
//@Profile("production")
public class SecurityConfig
{
// HTTPS Settings - Begin
@Bean
public TomcatServletWebServerFactory httpsRedirectConfig()
{
return new TomcatServletWebServerFactory()
{
@Override
protected void postProcessContext(Context context)
{
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
}
// HTTPS Settings - End
}
发布于 2022-11-04 09:41:43
设置像Tomcat这样的Java /TLS(包括HTTPS)服务器的正确过程之一是:
openssl req -new -newkey ...
来创建密钥和CSR,都是在PEM中
之前转换成。
openssl pkcs12 -export -in cert1PEM -inkey keyPEM [-certfile cert2PEM] [-friendlyname somename] -out p12file
cert1PEM
必须至少包含服务器证书,并且可以包含另一个证书(链/中间和(可选的根)证书);如果它不包含服务器证书,那么这些证书必须在-certfile cert2PEM
中。-friendlyname somename
是可选的,但是您显示的来自keytool
的输出意味着它被使用了(,包括keytool显示它为别名)。
keytool -importkeystore -srckeystore p12file -destkeystore jksfile ...
但是我不相信你说‘Java17是活动的’,除非.jks文件已经存在,而它不应该存在。Java9up(包括17 )默认以PKCS12 (而不是JKS )的形式创建新的密钥存储库文件,不会产生警告。Java 8的最新更新将。(也就是说,j8的所有默认输出都会被更新到JKS,最近的更新会在这样做时发出警告。)
在任何情况下,步骤4都是过时和不必要的。从2015年的8u 60开始,所有版本的Java默认都可以读取PKCS12 (由步骤3生成),根本不需要JKS文件。即使是较早的版本(大约在2000年左右)也可以阅读PKCS12,只需稍微修改配置,我就会推荐这一点,因为JKS是“专有的”(正如现在的警告所述),而且还很弱(警告没有这样说)。
https://stackoverflow.com/questions/74317632
复制