如何使用自签名SSL证书服务端和客户端

作者: 沐风之境

如何使用自签名SSL证书服务端和客户端

基本生成步骤:

  1. 首先生成CA根证书
  2. 然后生成服务端证书
  3. 最后生成客户端证书,如果不需要做双向认证的话忽略

1. 首先生成根证书

 生成root私钥
openssl genrsa -out root.key 1024

 根据私钥创建根证书请求文件,需要输入一些证书的元信息:邮箱、域名等
openssl req -new -out root.csr -key root.key

 结合私钥和请求文件,创建根证书,有效期10年
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

2.然后生成服务端证书

 创建服务端私钥
openssl genrsa -out server.key 1024

 根据私钥生成请求文件
openssl req -new -out server.csr -key server.key

 结合私钥和请求文件创建服务端证书,有效期10年
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ../root_ca/root.crt -CAkey ../root_ca/root.key -CAcreateserial -days 3650

如果需要只需要部署服务端证书端话,就可以结束了。拿着server.crt公钥和server.key私钥部署在服务器上,然后解析域名到改服务器指向到IP,证书就部署成功了。

3.最后生成客户端证书

如果需要做双向验证的,也就是服务端要验证客户端证书的情况。那么需要在同一个根证书下再生成一个客户端证书

 生成私钥
openssl genrsa -out client.key 1024

 申请请求文件
openssl req -new -out client.csr -key client.key

 生成证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ../root_ca/root.crt -CAkey ../root_ca/root.key -CAcreateserial -days 3650

 生成客户端集成证书pkcs12格式的文件,方便浏览器或者http客户端访问(密码:123456)
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

服务器配置

1.服务域名加证书

使用Caddy作为服务器来部署https服务
Caddyfile

{
  admin off  关闭运维接口
  auto_https off  自动配置https关闭
}

https://example.com {
    tls <证书文件路径> <私钥文件路径>
}

2.需要双向证书认证

{
  admin off  关闭运维接口
  auto_https off  自动配置https关闭
}

https://example.com {
    tls <证书文件路径> <私钥文件路径> {
        client_auth {
            mode require_and_verify
            trusted_ca_cert_file <根证书文件路径>
        }
    }
}

客户端配置

需要在客户端设置根证书,并信任根证书。因为服务端的证书是自签的证书,公共的CA是无法认证自签的证书的。所以需要在客户端添加并信任自己的根证书后才能通过https访问服务端。如果服务器上部署的是公共CA签发的证书,则不需要设置,因为系统中已经内置了大部分公共CA的证书

使用Postman

Settings -> Certificates -> CA Certificates -> PEM file中选择根证书文件。
配置好后就可以使用https访问服务了

使用HttpClient访问如何配置客户端

使用程序来调用https会比较复杂,大概总结起来可以分为一下几个步骤:

  1. 读取根证书文件流
  2. 获取KeyStore
  3. 将根证书加载到KeyStore中
  4. 获取SSLContexts实例
  5. 将SSLContexts实例作为参数,设置协议http和https对应的处理socket链接工厂的对象
  6. 将链接工厂作为作为参数,生成链接管理器
  7. 将链接管理器作为参数,生成httpclient客户端
public class SSLContextBuilder {
    public static String build(String keyStorePath, String keyStorepass) {
        SSLContext sc = null;
        FileInputStream instream = null;
        KeyStore trustStore = null;
        try {
            trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            instream = new FileInputStream(new File(keyStorePath));
            trustStore.load(instream, keyStorepass.toCharArray());
            // 相信自己的CA和所有自签名的证书
            sc = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
        } catch (KeyStoreException | NoSuchAlgorithmException| CertificateException | IOException | KeyManagementException e) {
            e.printStackTrace();
            try {
                instream.close();
            } catch (IOException e) {
            }
        }
        return sc;
    }
}
```java
public class HttpClientInstanceBuilder {
    public static CloseableHttpClient builde() {
        // 如果密码为空,则用"nopassword"代替
        SSLContext sslcontext = SSLContextBuilder.build("<根证书文件路径>", "<证书密码>");
         // 设置协议http和https对应的处理socket链接工厂的对象
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.INSTANCE)
            .register("https", new SSLConnectionSocketFactory(sslcontext))
            .build();

        PoolingHttpClientConnectionManager connManager = 
        new PoolingHttpClientConnectionManager(socketFactoryRegistry);

        CloseableHttpClient clientInstance = HttpClients
            .custom()
            .setConnectionManager(connManager)
            .build();
        return clientInstance;
    }
}

这样就能拿到支持访问自签证书的httpClient客户端了

https双向认证

如果服务器开启了双向认证,那么客户端还要提供同和服务器证书同属于一个根证书的客户端证书。

给客户端添加客户端证书和私钥

客户端添加证书可以采用PKCS格式证书,它会将证书和私钥绑定到一个文件中

那如何加载.p12.pfx文件到客户端?

和加载根证书类似

public class SSLContextBuilder {
    // 如果密码为空,则用"nopassword"代替
    public static String build(String keyStorePath, String keyStorepass) {
        SSLContext sc = null;
        FileInputStream instream = null;
        KeyStore trustStore = null;
        try {
            KeyStore trustStore = KeyStore.getInstance("PKCS12");
            instream = new FileInputStream(new File(keyStorePath));
            trustStore.load(instream, keyStorepass.toCharArray());
            // 和根证书加载到区别就在这里,加载证书的方式不同
            sc = SSLContexts.custom().loadKeyMaterial(trustStore, keyStorepass.toCharArray()).build();
        } catch (KeyStoreException | NoSuchAlgorithmException| CertificateException | IOException | KeyManagementException e) {
            e.printStackTrace();
            try {
                instream.close();
            } catch (IOException e) {
            }
        }
        return sc;
    }
}

原文创作:沐风之境

原文链接:https://www.cnblogs.com/mufeng3421/p/13896400.html

更多推荐

更多
  • Kubenetes CKA和CKAD认证-五、工作负载 在 specs 的下面,容器规格,Pod 控制器,复制集控制器,部署控制器,更新和回滚,部署策略,运行作业,CronJob 控制器,再造战略,滚动更新策略,作业控制器,运行一个 Pod 直到完成,运行几个 pod,直到一个完成,运行几个
    Apache CN

  • Kubenetes CKA和CKAD认证-一、使用 Kubernetes 创建集群 调配计算资源,在主机上安装 Docker,在主机上安装 kubeadm、kubelet 和 kubectl,初始化控制面板节点,加入工人队伍, 在本章中,您将在 Google Cloud 中的虚拟机上部署一个 Kubernetes 集群
    Apache CN

  • Kubenetes CKA和CKAD认证-四、Kubernetes 资源 命名空间,标签和选择器,释文,Kubernetes 以声明的方式工作:您在 Kubernetes API 的帮助下创建资源,这些对象存储在 etcd 存储中,控制器工作以确保您在这些对象中声明的内容正确地部署在您的基础设施中。
    Apache CN

  • Kubenetes CKA和CKAD认证-三、访问集群 在您的开发机器上安装 kubectl,从开发机器访问集群,Linux 操作系统,苹果,Windows 操作系统, 在前面的章节中,您已经在 Kubernetes 主机上安装了`kubectl`,并从这些主机上使用它。使用`kubectl
    Apache CN

  • Kubenetes CKA和CKAD认证-二、控制面板组件 探索控制面板服务,Kubernetes 控制面板由以下部分组成API 服务器`kube-apiserver`,Kubernetes 控制面板的前端键值存储`etcd`,所有集群数据的后备存储调度器`kube
    Apache CN

  • Kubenetes CKA和CKAD认证-十一、安全 证明,批准,API 服务器请求的剖析,请求授权属性,RBAC 模式,安全上下文,在容器层面,网络策略,在节点上预拉映像,给库伯莱颁发证书,普通用户认证,服务帐户身份验证,群集外的服务帐户,资源请求,非资源请求,角色和集群角色,RoleB
    Apache CN

  • Kubenetes CKA和CKAD认证-十三、多容器 Pod 设计模式 初始化容器,初始化存储器,等待其他服务的可用性,边车容器,适配器容器,大使容器,Pod 是 Kubernetes 集群中可部署的最小部分。一个 Pod 可以包含一个或多个容器。当一个 Pod 包含几个容器时,这些容器共享网络和存储资
    Apache CN

  • Kubenetes CKA和CKAD认证-十四、可观察性 Kubernetes 级别的调试,在容器内部调试,调试服务,记录,节点级别的日志记录,使用节点日志记录代理进行集群级日志记录,使用 Sidecar 将日志重定向到标准输出,监视,用 Prometheus 监控, 使用 Kubernete
    Apache CN

  • Kubenetes CKA和CKAD认证-九、调度 POD 使用标签选择器在特定节点上调度 pod,向节点添加标签,向窗格添加节点选择器,人工调度,DaemonSet,静态吊舱,资源请求,以命令的形式,以声明的形式,运行多个调度程序,检查调度程序事件, 当您希望将一个 Pod 运行到 Kuber
    Apache CN

  • Kubenetes CKA和CKAD认证-十、发现和负载均衡 服务,服务类型,进入,选择器,就绪探测,端点,ClusterIP(群集 IP),节点端口,LoadBalancer(负载均衡器),外部名,安装 nginx 入口控制器,访问应用,HTTPS 和入口, 当您部署一个 Pod 时,它不容易接
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多