使用OpenSSL创建CA证书

参考文献:

一些nginx常用的命令:

检查配置文件是否正确:./nginx -t
启动Nginx 命令:./nginx 
重启Nginx 命令:./nginx -s reload	
停止Nginx 命令:	./nginx -s stop

1、安装Nginx过程:

yum install gcc-c++	# 安装gcc
yum install -y pcre pcre-devel	# 安装语言兼容正则表达式
yum install -y zlib zlib-devel	# 安装zlib
yum install -y openssl openssl-devel	# 安装OpenSSL(一个密码库)

事先下载好nginx到/usr/local/目录下,可以到 http://nginx.org/en/download.html 官网下载

tar -zxvf nginx-1.19.1	# 解压 我的版本是nginx-1.19.1
cd nginx-1.19.1		# 切换到解压 nginx-1.19.1目录下
./configure 		# 解析程序
cd /usr/local/nginx/sbin	
make	# 检查
make install	# 安装nginx
./nginx --with-http_ssl_module			#运行nginx 加入一个ssl服务的模块

到这里如果顺利的话就安装好了,接下来就是配置了,配置文件在/usr/local/nginx/conf/nginx.conf


2、使用OpenSSL创建CA证书

命令如下(其中填一些信息什么的,可以参考网上的,这里不多累赘了,图我贴下面了):

mkdir CA	# 单独创建一个文件用来装证书,以免和其他文件混淆我放在/usr/local这个目录下
cd CA	# 切换到CA目录下
openssl genrsa -out local.key 2048	# 生成CA私钥
openssl req -new -key local.key -out local.csr	# 生成CA证书请求
openssl x509 -req -in local.csr -extensions v3_ca -signkey local.key -out local.crt	# 生成CA根证书
openssl genrsa -out my_server.key 2048 # 生成server私匙
openssl x509 -req -in local.csr -extensions v3_ca -signkey local.key -out local.crt	# 生成server证书请求
openssl x509 -days 365 -req -in my_server.csr -extensions v3_req -CAkey local.key -CA local.crt -CAcreateserial -out my_server.crt	# 生成server证书

以上一些执行步骤的图解,可按照自己的实际情况进行填写

You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN  #国家
State or Province Name (full name) []:BJ   #省份
Locality Name (eg, city) [Default City]:BJ  #城市
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:test   #部门
Common Name (eg, your name or your server's hostname) []:test   #主机名
Email Address []:test@test.com  #邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:wuminyan  #密码
An optional company name []:wuminyan  #姓名
执行完以上命令文件夹内会有以下文件:
[root@huahua CA]# ll
total 28
-rw-r--r-- 1 root root 1371 Mar 21 16:47 local.crt
-rw-r--r-- 1 root root 1147 Mar 21 16:44 local.csr
-rw-r--r-- 1 root root 1679 Mar 21 16:41 local.key
-rw-r--r-- 1 root root   17 Mar 21 16:52 local.srl
-rw-r--r-- 1 root root 1314 Mar 21 16:52 my_server.crt
-rw-r--r-- 1 root root 1094 Mar 21 16:50 my_server.csr
-rw-r--r-- 1 root root 1679 Mar 21 16:46 my_server.key

证书位置:/usr/local/CA/local.crt

私钥位置:/usr/local/CA/local.key

解释一下:

.key通常指私钥

.csr 是Certificate Signing Request的缩写,即证书签名申请,这不是证书,这是要求CA给证书签名的一种正是申请,该申请包含申请证书的实体的公钥及该实体店某些信息。该数据将成为证书的一部分。CSR始终使用它携带的公钥所对应的私钥进行签名。

.crt 即 certificate的缩写,即证书

3、配置文件(/usr/local/nginx/conf/nginx.conf)如下,其中只需要改这一部分即可

#   HTTPS server
	server {
        listen       443 ssl;
        server_name  localhost;
        charset utf-8;

        ssl_certificate      /usr/local/CA/local.crt;	# 证书
        ssl_certificate_key  /usr/local/CA/local.key;	# 私钥

        ssl_session_cache    shared:SSL:10m;	# 会话缓存设置 10M
        ssl_session_timeout  10m;	# 长连接时间 10 min

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

	location / {
		#假设公网IP:192.168.133.132
		# 则所有请求192.168.133.132都会跳转到这个172.0.0.1:8080
           proxy_pass   http://127.0.0.1:8080;	
           proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

}

以下是nginx配置文件(/usr/local/nginx/conf/nginx.conf)全部内容

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
			# huahua更改配置
           # root   html;
           #index  index.html index.htm;x
           proxy_pass   http://127.0.0.1:8080;
           proxy_set_header  Host $host;
           proxy_set_header   X-real-ip $remote_addr;
           proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


 #   HTTPS server
	server {
        listen       443 ssl;
        server_name  localhost;
        charset utf-8;

        ssl_certificate      /usr/local/CA/local.crt;	
        ssl_certificate_key  /usr/local/CA/local.key;

        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  10m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

	location / {
           proxy_pass   http://127.0.0.1:8080;
           proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

}    

}

还有最后一步,如果是云服务器,就要到安全组把443端口开启如下

nginx证书 crt pem区别 nginx配置ca证书_ci

然后访问服务器https://公网IP,如下所示:

nginx证书 crt pem区别 nginx配置ca证书_ci_02

我们可以看到这个连接不是安全的连接,因为这是我用自己颁发给自己的证书,那肯定得不到CA公证机构的认可,所以显示是不安全的连接,如果要显示安全的可以到CA机构去申请一个,有的是免费的,我这里就不进行展开了。

我们点继续前往,可以看到如下:

nginx证书 crt pem区别 nginx配置ca证书_html_03


成功连接到服务器,证明nginx可用,使用的也是HTTPS。


3、可能遇到的错误:

未知的错误1:

nginx: [emerg] unknown directive "HTTPS" in /usr/local/nginx/conf/nginx.conf:103
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

解决:把/usr/local/nginx/conf/nginx.conf配置文件种的HTTPS使用 “#” 号注释掉即可

未知的错误2(这是我安装nginx时没有配置好的原因,如果按照上面的步骤,应该不会出现这个问题):

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:104
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

然后看网上的人说是没有安装一个东西,我查看了版本如下

[root@huahua nginx]# ./sbin/nginx -V	# 查看版本信息
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments:
[root@huahua nginx]#

如果nginx是运行状态的话,要先停止(在/usr/local/nginx/sbin目录下执行):

./nginx -s stop

如果停止不了或者报错误:

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:104

那是因为配置文件暂时错了,为什么这么说呢?

因为配置的SSL是对的,但是由于当前nginx缺少一个模块(with-http_ssl_module),读取不了SSL配置信息,所以是暂时错了,把配置过的SSL都删除或者注释掉,然后再配置回来就可以了
然后到/usr/local/nginx-1.18.0 目录(注意:是安装包的目录)下执行以下命令:

执行停止nginx命令:

./nginx -s stop

然后执行添加模板

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

最后运行 make & make install 即可,如果还不行就请试一下重新安装nginx,请参照上面的安装Nginx过程


个人笔记

可以将http请求自动转成https,不知道对不对, 我也没试过哈哈哈!

server {
    listen 80;
    server_name huiblog.top;
    #将http请求转成https
    rewrite ^(.*)$ https://$host$1 permanent;
}

(完)