代码之家  ›  专栏  ›  技术社区  ›  Tony

如何在spring boot中配置ssl?

  •  2
  • Tony  · 技术社区  · 6 年前

    我需要我的restful服务在spring boot中支持ssl。虽然服务应用程序启动成功,但我无法在Chrome中访问该页面(版本:68.0.3440.106)。错误消息err_SSL_VERSION_或_CIPHER_不匹配

    错误消息的捕获图像: error message

    项目的pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>test</groupId>
      <artifactId>spring-restful-server-https</artifactId>
      <version>1.0.0</version>
      <packaging>jar</packaging>
    
    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    配置文件(故意屏蔽密码):

    server.port=8443
    server.ssl.key-store=classpath:shq.jks
    server.ssl.key-store-password=******
    server.ssl.key-password=******
    

    package test.spring_restful_server_https;
    
    import java.util.concurrent.atomic.AtomicLong;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
        private static final String template = "Hello, %s!";
        private final AtomicLong counter = new AtomicLong();
    
        @RequestMapping("/greeting")
        public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
            return new Greeting(counter.incrementAndGet(),
                                String.format(template, name));
        }
    }
    

    我使用java keytool生成shq.jks文件。
    keytool命令:

    keytool -genkeypair -alias shq -keystore shq.jks
    

    keytool -list -keystore shq.jks -v
    

    jks文件信息(我的环境是中文,所以我翻译信息并放在括号中):

    密钥库类型(keystore type): JKS
    密钥库提供方(keystore provider): SUN
    
    您的密钥库包含 1 个条目(your keystore contains 1 entry)
    
    别名(alias name): shq
    创建日期(creation date): 2018-8-16
    条目类型(entry type): PrivateKeyEntry
    证书链长度(certificate chain length): 1
    证书(certificate)[1]:
    所有者(owner): CN=shq, OU=home, O=home, L=shanghai, ST=shanghai, C=cn
    发布者(issuer): CN=shq, OU=home, O=home, L=shanghai, ST=shanghai, C=cn
    序列号(serial number): 279abe96
    有效期开始日期(valid from): Thu Aug 16 21:02:31 CST 2018, 截止日期(until): Wed Nov 14 21:02:31 CST 2018
    证书指纹(certificate fingerprints):
             MD5: 78:E1:91:21:04:AC:38:F1:0B:30:D8:51:69:FD:BE:28
             SHA1: 8A:D5:1C:26:69:6B:5C:50:75:A6:E8:BE:66:2F:58:01:68:8F:78:1A
             SHA256: 74:0F:F1:0D:59:75:93:3B:BD:55:75:3D:F1:E8:23:17:CE:5D:C0:14:63:0D:D9:53:54:29:C2:C4:70:5A:82:C0
             签名算法名称(signature algorithm name): SHA1withDSA
             版本(version): 3
    
    扩展(extensions):
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: AF 9F 16 35 95 36 FD 13   0C EA 19 F8 A0 D0 E3 6F  ...5.6.........o
    0010: A6 CB BB EE                                        ....
    ]
    ]
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   dave_thompson_085    6 年前

    keytool -genkeypair 默认情况下,创建一个DSA密钥和(自签名)证书,以及 (SSL/TLS称之为歇斯底里葡萄干的DSS)。我知道这是过去的事,因为我用过那种方法,但我确定上次是很久以前的事了。修复 那个 添加 -keyalg rsa . 此外,如果您不使用当前或最新版本的Java, keytool 漂亮的 -keysize 2048 .

    但这还不够。 密钥工具-genkeypair 没有“SAN”扩展名 (主题替代名称)。SAN已经 对于HTTPS证书,从本世纪初开始,直到去年Chrome 它。幸运的是最近的版本 钥匙工具 如果您 add -ext SAN=type:value[,...] . 但请注意SAN中的值 必须匹配 名字 用于连接 https://127.0.0.1:port/ 如您的文章所示,证书的SAN必须包含 IP:127.0.0.1 ;域名的条目,如 DNS:myhost.foo 是一个不同的名称,不匹配并且将不被接受,即使 myhost.foo 解析为地址127.0.0.1。SAN支持多个条目,因此您可以拥有一个或多个IP和/或一个或多个DNS(如果您愿意)。(如果您使用另一个浏览器,现在就可以省去SAN了, 如果

    如果你不知道,因为你没有提到,一个自签名的证书 钥匙工具 (或者其他很多事情,比如 openssl req -new -x509 如果您要从其他客户机访问它,我想您会这样做,不同客户机使用的信任库通常依赖于客户机,对此您什么也没说。

    补充:这看起来像是在2016年发生的;他们删除了所有DHE密钥交换,作为防止DHE(也称为Logjam)过小的一种粗制滥造的方法,并且只有DSA(DSS)密钥交换需要DHE。 https://bugs.chromium.org/p/chromium/issues/detail?id=619194