使用 https 在 java 中休息 api
Rest api in java using https
当我使用 GET
、POST
等在 java 中创建 Restservices
时,我请求他们使用
http protocol
。我一使用 https 就报错。
例如:http://localhost:8080/demorest/webapi/aliens
工作正常。
但是当我使用 https
查询相同内容时
https://localhost:8080/demorest/webapi/aliens
我收到错误 site can not provide secured connection
需要进行哪些修改才能使它们与 https
兼容。
视情况而定,您的其他服务可能 运行 在 Tomcat 或 Spring 启动,所以应该阅读他们的文档,您也可以使用不同的 https 服务,例如代理所有或从 https 到 http 的部分请求。
- 首先检查https协议使用与8080相同的端口?在大多数情况下,http(8080)和 https(8443 或 443)使用不同的端口。
- 如果端口正确,则导入证书。
如果你能提供你正在使用的服务器,那将会很有帮助,如果 java 版本,框架(如果有的话)和它们的版本,在这种情况下当然是服务器和服务器版本。
在link中提到here on DZone you can find an example of how to set up https
locally with tomcat server in a java application, else you can also try with a more generic article not specific to java here on freecodecamp
第 1 步: 您可以使用 java keytool 创建密钥库;
命令:keytool -genkey -alias {any-name} -keyalg RSA -keystore {存储密钥库的路径}
第 2 步: 您可以转到您的服务器配置文件,例如 conf/server。xml Tomcat 并取消注释 8443 设置然后在标签结束前添加以下内容;
keystoreFile="{密钥库路径}"
keystorePass="{您在创建密钥库时设置的密码}" />
第 3 步: 现在重新启动服务器并点击“https://localhost:8443/demorest/webapi/aliens”。
编码愉快!
正如您所说,您是 API 的新手,这里为您提供了详细的解答。
答案是基于您正在使用 tomcat 服务器的假设。有 4 个步骤的方法可以在 https 上申请 运行ning,下面是红色
- 获取 SSL 证书或生成自签名 SSL 证书
- 在应用程序中启用 HTTPS
- 将 HTTP 重定向到 HTTPS
- 将 SSL 证书分发给客户端。
如果您还没有 ssl 证书,请使用密钥工具自行生成。
Keytool 是与 JDK 一起提供的证书管理实用程序,因此如果您安装了 JDK,您应该已经拥有可用的 keytool。
让我们打开终端提示符并编写以下命令来创建 JKS 密钥库:
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore
keystore.jks -validity 3650 -storepass password
要创建一个 PKCS12 密钥库,我们应该,命令如下:
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype
PKCS12 -keystore keystore.p12 -validity 3650 -storepass password
让我们仔细看看刚才的命令 运行:
genkeypair: generates a key pair;
alias: the alias name for the item we are generating;
keyalg: the cryptographic algorithm to generate the key pair;
keysize: the size of the key. We have used 2048 bits, but 4096 would be a better choice for production;
storetype: the type of keystore;
keystore: the name of the keystore;
validity: validity number of days;
storepass: a password for the keystore.
当运行执行上一个命令时,我们会被要求输入一些信息,但我们可以随意跳过所有这些信息(只需按Return 跳过一个选项)。当询问信息是否正确时,我们应该输入是。最后,我们点击 return 将密钥库密码也用作密钥密码。
What is your first and last name?
[Unknown]: What is the name of your organizational unit?
[Unknown]: What is the name of your organization?
[Unknown]: What is the name of your City or Locality?
[Unknown]: What is the name of your State or Province?
[Unknown]: What is the two-letter country code for this unit?
[Unknown]: Is CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes
Enter key password for <tomcat>
(RETURN if same as keystore password):
验证密钥库内容
查看JKS格式的keystore内容,我们可以再次使用keytool:
keytool -list -v -keystore keystore.jks
按照 PKCS12 格式测试密钥库的内容:
keytool -list -v -storetype pkcs12 -keystore keystore.p12
将 JKS 密钥库转换为 PKCS12
如果我们已经有一个 JKS 密钥库,我们可以选择将它迁移到 PKCS12; keytool 有一个方便的命令:
keytool -importkeystore -srckeystore keystore.jks -destkeystore
keystore.p12 -deststoretype pkcs12
2.) 在您的项目中启用 https
如果您有 application.properties 个文件
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=password
server.ssl.key-alias=tomcat
security.require-ssl=true
如果您有 application.yml 个文件
server:
ssl:
key-store: classpath:keystore.p12
key-store-password: password
key-store-type: pkcs12
key-alias: tomcat
key-password: password
port: 8443
要在应用程序中实现,我们需要扩展 WebSecurityConfigurerAdapter
class,因为 security.require-ssl
属性 已被弃用。
如果您使用的是旧版本,则可以跳过下面提到的代码。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requiresChannel()
.anyRequest()
.requiresSecure();
}
}
3.) 将 http 重定向到 https
既然我们已经在 Spring 启动应用程序中启用了 HTTPS 并阻止了任何 HTTP 请求,我们希望将所有流量重定向到 HTTPS。
Spring 允许在 application.properties (or application.yml)
中只定义一个网络连接器。由于我们已将其用于 HTTPS,因此我们必须以编程方式为我们的 Tomcat 网络服务器设置 HTTP 连接器。
@Configuration
public class ServerConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = 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);
}
};
tomcat.addAdditionalTomcatConnectors(getHttpConnector());
return tomcat;
}
private Connector getHttpConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
4.) 将 SSL 证书分发给客户端
使用自签名 SSL 证书时,我们的浏览器不会信任我们的应用程序,并会警告用户它不安全。这对任何其他客户端都是一样的。
可以通过向客户提供我们的证书来让客户信任我们的应用程序。
从密钥库中提取 SSL 证书
我们已将证书存储在密钥库中,因此我们需要提取它。同样,keytool 对我们的支持非常好:
keytool -export -keystore keystore.jks -alias tomcat -file
myCertificate.crt
使浏览器信任 SSL 证书
使用行业标准PKCS12格式的keystore时,我们应该可以直接使用,无需解压证书。
我建议您查看有关如何将 PKCS12 文件导入特定客户端的官方指南。
如果在本地主机上部署应用程序,我们可能需要在浏览器中执行进一步的操作:启用与 localhost
的不安全连接。
在Chrome中,我们可以在搜索栏中输入如下URL:chrome://flags/#allow-insecure-localhost
并激活相关选项。
在 JRE 密钥库中导入 SSL 证书
为了让 JRE 信任我们的证书,我们需要将其导入到 cacerts 中:JRE 信任库负责保存所有可以信任的证书。
首先,我们需要知道通往 JDK 家的路。如果我们使用 Eclipse 或 STS 作为我们的 IDE,一个快速找到它的方法是转到 Preferences > Java > Installed JREs。如果使用 IntelliJ IDEA,我们可以通过转到项目结构 > SDK 并查看 JDK 主路径字段的值来访问此信息。
然后,在我们的终端提示符下,让我们插入以下命令(我们可能需要 运行 通过在它前面加上 sudo 来获得管理员权限):
keytool -importcert -file myCertificate.crt -alias tomcat -keystore
$JDK_HOME/jre/lib/security/cacerts
你可以参考 github here
上的项目
当我使用 GET
、POST
等在 java 中创建 Restservices
时,我请求他们使用
http protocol
。我一使用 https 就报错。
例如:http://localhost:8080/demorest/webapi/aliens
工作正常。
但是当我使用 https
https://localhost:8080/demorest/webapi/aliens
我收到错误 site can not provide secured connection
需要进行哪些修改才能使它们与 https
兼容。
视情况而定,您的其他服务可能 运行 在 Tomcat 或 Spring 启动,所以应该阅读他们的文档,您也可以使用不同的 https 服务,例如代理所有或从 https 到 http 的部分请求。
- 首先检查https协议使用与8080相同的端口?在大多数情况下,http(8080)和 https(8443 或 443)使用不同的端口。
- 如果端口正确,则导入证书。
如果你能提供你正在使用的服务器,那将会很有帮助,如果 java 版本,框架(如果有的话)和它们的版本,在这种情况下当然是服务器和服务器版本。
在link中提到here on DZone you can find an example of how to set up https
locally with tomcat server in a java application, else you can also try with a more generic article not specific to java here on freecodecamp
第 1 步: 您可以使用 java keytool 创建密钥库;
命令:keytool -genkey -alias {any-name} -keyalg RSA -keystore {存储密钥库的路径}
第 2 步: 您可以转到您的服务器配置文件,例如 conf/server。xml Tomcat 并取消注释 8443 设置然后在标签结束前添加以下内容;
keystoreFile="{密钥库路径}" keystorePass="{您在创建密钥库时设置的密码}" />
第 3 步: 现在重新启动服务器并点击“https://localhost:8443/demorest/webapi/aliens”。
编码愉快!
正如您所说,您是 API 的新手,这里为您提供了详细的解答。
答案是基于您正在使用 tomcat 服务器的假设。有 4 个步骤的方法可以在 https 上申请 运行ning,下面是红色
- 获取 SSL 证书或生成自签名 SSL 证书
- 在应用程序中启用 HTTPS
- 将 HTTP 重定向到 HTTPS
- 将 SSL 证书分发给客户端。
如果您还没有 ssl 证书,请使用密钥工具自行生成。 Keytool 是与 JDK 一起提供的证书管理实用程序,因此如果您安装了 JDK,您应该已经拥有可用的 keytool。
让我们打开终端提示符并编写以下命令来创建 JKS 密钥库:
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650 -storepass password
要创建一个 PKCS12 密钥库,我们应该,命令如下:
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650 -storepass password
让我们仔细看看刚才的命令 运行:
genkeypair: generates a key pair;
alias: the alias name for the item we are generating;
keyalg: the cryptographic algorithm to generate the key pair;
keysize: the size of the key. We have used 2048 bits, but 4096 would be a better choice for production;
storetype: the type of keystore;
keystore: the name of the keystore;
validity: validity number of days;
storepass: a password for the keystore.
当运行执行上一个命令时,我们会被要求输入一些信息,但我们可以随意跳过所有这些信息(只需按Return 跳过一个选项)。当询问信息是否正确时,我们应该输入是。最后,我们点击 return 将密钥库密码也用作密钥密码。
What is your first and last name?
[Unknown]: What is the name of your organizational unit?
[Unknown]: What is the name of your organization?
[Unknown]: What is the name of your City or Locality?
[Unknown]: What is the name of your State or Province?
[Unknown]: What is the two-letter country code for this unit?
[Unknown]: Is CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
[no]: yes
Enter key password for <tomcat>
(RETURN if same as keystore password):
验证密钥库内容 查看JKS格式的keystore内容,我们可以再次使用keytool:
keytool -list -v -keystore keystore.jks
按照 PKCS12 格式测试密钥库的内容:
keytool -list -v -storetype pkcs12 -keystore keystore.p12
将 JKS 密钥库转换为 PKCS12
如果我们已经有一个 JKS 密钥库,我们可以选择将它迁移到 PKCS12; keytool 有一个方便的命令:
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype pkcs12
2.) 在您的项目中启用 https
如果您有 application.properties 个文件
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=password
server.ssl.key-alias=tomcat
security.require-ssl=true
如果您有 application.yml 个文件
server:
ssl:
key-store: classpath:keystore.p12
key-store-password: password
key-store-type: pkcs12
key-alias: tomcat
key-password: password
port: 8443
要在应用程序中实现,我们需要扩展 WebSecurityConfigurerAdapter
class,因为 security.require-ssl
属性 已被弃用。
如果您使用的是旧版本,则可以跳过下面提到的代码。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requiresChannel()
.anyRequest()
.requiresSecure();
}
}
3.) 将 http 重定向到 https
既然我们已经在 Spring 启动应用程序中启用了 HTTPS 并阻止了任何 HTTP 请求,我们希望将所有流量重定向到 HTTPS。
Spring 允许在 application.properties (or application.yml)
中只定义一个网络连接器。由于我们已将其用于 HTTPS,因此我们必须以编程方式为我们的 Tomcat 网络服务器设置 HTTP 连接器。
@Configuration
public class ServerConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = 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);
}
};
tomcat.addAdditionalTomcatConnectors(getHttpConnector());
return tomcat;
}
private Connector getHttpConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
4.) 将 SSL 证书分发给客户端 使用自签名 SSL 证书时,我们的浏览器不会信任我们的应用程序,并会警告用户它不安全。这对任何其他客户端都是一样的。
可以通过向客户提供我们的证书来让客户信任我们的应用程序。
从密钥库中提取 SSL 证书 我们已将证书存储在密钥库中,因此我们需要提取它。同样,keytool 对我们的支持非常好:
keytool -export -keystore keystore.jks -alias tomcat -file myCertificate.crt
使浏览器信任 SSL 证书 使用行业标准PKCS12格式的keystore时,我们应该可以直接使用,无需解压证书。
我建议您查看有关如何将 PKCS12 文件导入特定客户端的官方指南。
如果在本地主机上部署应用程序,我们可能需要在浏览器中执行进一步的操作:启用与 localhost
的不安全连接。
在Chrome中,我们可以在搜索栏中输入如下URL:chrome://flags/#allow-insecure-localhost
并激活相关选项。
在 JRE 密钥库中导入 SSL 证书 为了让 JRE 信任我们的证书,我们需要将其导入到 cacerts 中:JRE 信任库负责保存所有可以信任的证书。
首先,我们需要知道通往 JDK 家的路。如果我们使用 Eclipse 或 STS 作为我们的 IDE,一个快速找到它的方法是转到 Preferences > Java > Installed JREs。如果使用 IntelliJ IDEA,我们可以通过转到项目结构 > SDK 并查看 JDK 主路径字段的值来访问此信息。
然后,在我们的终端提示符下,让我们插入以下命令(我们可能需要 运行 通过在它前面加上 sudo 来获得管理员权限):
keytool -importcert -file myCertificate.crt -alias tomcat -keystore $JDK_HOME/jre/lib/security/cacerts
你可以参考 github here
上的项目