openssl生成自签名证书

1、生成一个自定义的CA机构,生成证书

openssl req -x509 -sha256 -days 356 -nodes -newkey rsa:2048 -subj  "/CN=msetproot/C=CN/L=GuangDong" -keyout rootCA.key -out rootCA.crt

-subj “/CN=1111/C=CN/L=GuangDong”
1111替换为自定义的机构名称
会出现两个文件

rootCA.key
rootCA.crt CA机构的证书

2、创建服务器私钥

openssl genrsa -out server.key 2048

3、创建证书签名请求配置文件

cat > csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = US
ST = California
L = San Fransisco
O = MLopsHub
OU = MlopsHub Dev
CN = 127.0.0.1

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
IP.1 = 127.0.0.1

EOF

/*
创建一个csr.conf文件以包含生成 CSR 的所有信息。替换127.0.0.1为自己的域名或 IP 地址
也可以不指定配置文件,直接生成的时候手动填写
这些问题的答案并不重要.他们在查看证书时出现.但是我们几乎不需要查看证书

证数各参数含义如下:

C-----国家(Country Name)
ST----省份(State or Province Name)
L----城市(Locality Name)
O----公司(Organization Name)
OU----部门(Organizational Unit Name)
CN----产品名(Common Name)
emailAddress----邮箱(Email Address)

req_distinguished_name :根据情况进行修改

alt_names: 127.0.0.1修改为 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com
*/

4、使用服务器私钥生成证书签名请求 (CSR)

openssl req -new -key server.key -out server.csr -config csr.conf

5、使用根证书生成数字证书,先写好配置文件

//127.0.0.1修改为 EMQ X 服务器实际的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或
//DNS.1 = broker.xxx.com

cat > cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 192.168.6.236

EOF

6、使用自签名 CA 生成 SSL 证书

openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile cert.conf

cert.conf 用来生成根证书(server.crt)的配置
csr.conf 用来生成向CA机构提申请的文件(server.csr)的配置
rootCA.crt 生成的自定义CA机构的拥有的证书
rootCA.key 生成的自定义CA机构的拥有的密钥
rootCA.srl
server.crt 服务器证书
server.csr 证书签名请求 (CSR),包含自己需要申请的服务器证书的配置信息
server.key 服务器私钥,用来生成(server.csr),想CA申请 服务器证书

nginx配置示例

server {
        listen 8088 ssl;   #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。
        server_name 192.168.6.236;  #将localhost修改为您证书绑定的域名,例如:www.example.com。
        #root html;
        #index index.html index.htm;
        ssl_certificate server.crt;   #将domain name.pem替换成您证书的文件名。
        ssl_certificate_key server.key;   #将domain name.key替换成您证书的密钥文件名。
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #使用此加密套件。
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #使用该协议进行配置。
        ssl_prefer_server_ciphers on;

        charset utf-8;

        #access_log  logs/host.access.log  main;

        client_max_body_size 1024M;
        client_body_buffer_size 2M;

        error_page 497 https://$http_host$request_uri;

        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        #add_header Content-Security-Policy upgrade-insecure-requests;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;

            proxy_connect_timeout 300;
            # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding off;

            proxy_pass http://localhost:8080/;
        }

        location ~*/(upload|static|videos)/ {
			root   "D:\Msetp-platform\webapps\ROOT";
            index  index.html index.htm;
            expires 1d;
        }
    }

7、生成tomcat需要的证书

openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12


keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12 -deststoretype jks

keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个示例代码,展示了如何使用 OpenSSL 中的 EVP 接口生成签名并将签名写入文件: ```c++ #include <openssl/evp.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/bio.h> #include <openssl/buffer.h> #include <iostream> #include <fstream> using namespace std; string base64_encode(const unsigned char* buffer, size_t length) { BIO *bio, *b64; BUF_MEM *bptr = BUF_MEM_new(); b64 = BIO_new(BIO_f_base64()); bio = BIO_new(BIO_s_mem()); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); BIO_write(bio, buffer, length); BIO_flush(bio); BIO_get_mem_ptr(bio, &bptr); BIO_set_close(bio, BIO_NOCLOSE); BIO_free_all(bio); return string(bptr->data, bptr->length); } int main(int argc, char* argv[]) { // 初始化 OpenSSLOpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); // 读取私钥 ifstream key_file("private_key.pem"); if (!key_file.is_open()) { cerr << "Failed to open private key file" << endl; return 1; } RSA* rsa = PEM_read_RSAPrivateKey(key_file, nullptr, nullptr, nullptr); if (rsa == nullptr) { cerr << "Failed to read private key" << endl; return 1; } // 生成签名 EVP_MD_CTX* md_ctx = EVP_MD_CTX_new(); EVP_SignInit(md_ctx, EVP_sha256()); string data = "Hello, world!"; EVP_SignUpdate(md_ctx, data.c_str(), data.size()); unsigned int sig_len = EVP_PKEY_size(rsa); unsigned char* sig = new unsigned char[sig_len]; EVP_SignFinal(md_ctx, sig, &sig_len, rsa); // 将签名写入文件 ofstream sig_file("signature.bin", ios::binary); if (!sig_file.is_open()) { cerr << "Failed to open signature file" << endl; return 1; } sig_file.write(reinterpret_cast<const char*>(sig), sig_len); sig_file.close(); // 输出 Base64 编码的签名 string sig_base64 = base64_encode(sig, sig_len); cout << "Base64-encoded signature: " << sig_base64 << endl; // 清理资源 delete[] sig; EVP_MD_CTX_free(md_ctx); RSA_free(rsa); ERR_free_strings(); EVP_cleanup(); return 0; } ``` 这段代码通过 OpenSSL 库读取指定的私钥文件(`private_key.pem`),使用 SHA-256 算法计算数据(`Hello, world!`)的摘要,并使用私钥对摘要进行签名签名结果保存在一个二进制文件中(`signature.bin`),同时输出 Base64 编码的签名到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值