首先 下载ssl证书 可以在支付宝等大平台申请 因为本地jdk获取的证书在网页连接中会提示不安全,是不被浏览器认可的。
在Windows下的命令 (在系统jdk的bin目录下执行)
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
在linux命令下获取(在系统jdk的bin目录下执行)
keytool -genkey -alias tomcat -keyalg RSA -validity 20000 -keystore keystore.p12
会生成一个keystore.p12的文件
关于keytool的说明:
keytool -genkey -alias 你的证书别名 -keyalg 密钥算法 -keystore 证书库文件保存的位置和文件名 -keysize 密钥长度 -validity 证书有效期天数
配置application.yml
server:
port: 8081
ssl:
key-store: keystore.p12
key-store-password: test08
key-store-type: PKCS12
key-alias: tomcat
将上面生成的keystore.p12
文件移动到classpath下。
这时候https就可以访问了 但是和http是不兼容的 还要在启动类里面配置
import com.InitConfiguration;
import com.InitServiceConfiguration;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;
//import javax.servlet.MultipartConfigElement;
@Configuration
@EnableTransactionManagement
@SpringBootApplication
@Import({InitServiceConfiguration.class, InitConfiguration.class})
@ComponentScan("com.********")
public class AppApiApplication implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(AppApiApplication.class, args);
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
//将http访问重定向到https访问
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
//将http的访问端口重定向到https的访问端口
connector.setScheme("http");
//http的访问端口
connector.setPort(80);
connector.setSecure(false);
//https的访问端口 就是ssl证书的端口 默认是443
connector.setRedirectPort(443);
return connector;
}
@Override
public void run(String... arg0) throws Exception {
// TODO Auto-generated method stub
}
}
这样 当http 访问的时候会自动跳转为https访问
遇到的问题:
1.首先 在做接口测试的时候不能用网页链接拼接参数去访问 因为链接访问都是get请求 接口中有一些只允许post请求的
2.再用api测试的时候http访问需要加上query参数 https访问可以直接使用body参数
3.本地证书犹豫不被浏览器认可所以会显示为不安全 需要下载大平台证书 阿里云就有 可以免费一年
4.网上申请的ssl证书是需要绑定域名的 一个域名只允许安装一个ssl证书
5.当进入程序发送到测试环境时,api和网页链接访问是访问不了的 会提示不允许get请求 需要进入项目中按照前端页面的按钮测