网站首页 > 精选教程 正文
自打上个月买了云服务器,基于 wordpress 搭建了自己的博客站点后,我就为站点的安全性开始担忧
wordpress 的管理后台采用的是帐号密码登录,连个验证码都没有。太不安全了
虽然 php 是最好的开发语言,但是我不会啊,怎么搞下安全呢?
nginx 倒是可以做 ip 黑白名单,关键是我也没有固定的上网 ip 啊,不知道可不可以用 shadowsocks 代理来实现固定 ip。除了 nginx 的 ip 限制,还有什么办法呢?
https 双向认证
https 双向认证,我以前做的某个项目里用过,当时是做 B2B,公司的网站配置了双向数字认证,然后给所有客户签发数字证书,这样就只有认证的用户才能访问我们的网站。
基于这个思路,我的解决方案如下
- 给博客站再加一个域名(blog.refusea.com),该域名配置为使用双向数字证书认证
- 主域名将管理后台页面屏蔽,这个只要在 nginx 上配置为返回 404 即可
站点的访客使用主域名访问是没有任何限制的,但是要访问管理后台,就必须持有数字证书
自签发证书
既然这个双向认证是自用的,就没必要花钱买证书了,完全可以用 openssl 来自建 CA,自己给自己签发服务器证书和客户端证书
自签证书的步骤
- 创建 CA 根证书
- 用 CA 根证书签发二级 CA 证书
- 用 二级 CA 证书签发服务器证书,配置 blog.refusea.com 域名为双向数字认证
- 用 二级 CA 证书签发客户端证书,转换为 pkcs12 格式,导入到需要访问的电脑
自签发证书准备工作
环境为 Linux
mkdir /root/openssl
# 服务器,客户端的 openssl.cnf
cp /etc/pki/tls/openssl.cnf /root/openssl/server_openssl.cnf
cp /etc/pki/tls/openssl.cnf /root/openssl/user_openssl.cnf
# 修改上述文件
# 1) [ req ] 小节: 取消 req_extensions = v3_req 前面的注释
# 2) [ req_distinguished_name ] 小节: 注释 0.* 开头的内容
# 3) [ v3_req ] 小节
## 服务端增加如下内容,其中 DNS.1 是服务器域名,多个域名可以用 DNS.2/DNS.3/...
# extendedKeyUsage=serverAuth
# subjectAltName = @alt_names
# [ alt_names ]
# DNS.1 = blog.refusea.com
## 客户端
# extendedKeyUsage=clientAuth
创建证书目录
# 如果想使用其他目录,修改 /etc/pki/tls/openssl.cnf 的 [ tsa_config1 ] 小节
mkdir /etc/pki/CA/newcerts -p
touch /etc/pki/CA/index.txt
# 如果文件不存在,用以下命令创建
echo '01' > /etc/pki/CA/serial
cd /etc/pki/CA
签发 CA 根证书和二级 CA 证书
# 根证书
openssl genrsa -out ca_root.key 2048
openssl req -x509 -new -key ca_root.key -out ca_root.cer -days 3650 -subj "/C=CN/ST=GD/L=SZ/O=refusea/CN=Refusea-ROOT-CA"
# 二级证书
openssl genrsa -out sub_ca.key 2048
openssl req -new -key sub_ca.key -out sub_ca.csr -subj "/C=CN/ST=GD/L=SZ/O=refusea/CN=Refusea-SUB-CA"
openssl ca -extensions v3_ca -in sub_ca.csr -days 3650 -out sub_ca.cer -cert ca_root.cer -keyfile ca_root.key
用 二级 CA 证书签发服务器证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=refusea/CN=blog.refusea.com"
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.cer -CA sub_ca.cer -CAkey sub_ca.key -CAcreateserial -extensions v3_req -extfile /root/openssl/server_openssl.cnf
用二级 CA 证书签发客户端证书
openssl genrsa -out user.key 2048
openssl req -new -key user.key -out user.csr -subj "/C=CN/ST=GD/L=SZ/O=refusea/CN=wordpress"
openssl x509 -req -days 365 -in user.csr -signkey user.key -out user.cer -CA sub_ca.cer -CAkey sub_ca.key -CAcreateserial -extensions v3_req -extfile /root/openssl/user_openssl.cnf
将客户端证书导出为 pkcs12 格式
# 将根证书, 二级证书和用户证书合并
cat ca_root.cer sub_ca.cer user.cer > user_combination.cer
# 用合并证书生成 p12,这样在导入时能同时导入根证书,注意设置导出密码
openssl pkcs12 -export -inkey user.key -in user_combination.cer -out user.p12
在导出为 pkcs12 时,会提示输入密码,这个密码在将证书导入到 windows 电脑时要进行验证,这样可以避免证书被盗导致的风险
nginx 配置双向认证
在 http 下增加新的 server 节点
server {
listen 443 ssl;
server_name blog.refusea.com;
ssl_certificate cert/server.cer;
ssl_certificate_key cert/server.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;
# 双向认证
ssl_client_certificate cert/ca_root.cer;
ssl_verify_client on;
location / {
root /var/www/wordpress;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /var/www/wordpress;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx 主域名禁止访问管理后台
location = /wp-login.php {
return 404;
}
location /wp-admin/ {
return 404;
}
效果展示
首先访问下管理后台
ok,效果达成,那么用新域名来访问下
因为这个时候还没有导入证书,所以返回 400 状态码,那么就导入下证书吧,双击 openssl 生成的 user.p12,出现以下界面
一路默认即可,注意过程中需要输入密码,就是生成 pkcs12 时设置的密码。客户端证书导入成功后,会自动导入 CA 根证书
证书被导入到哪里了呢?我们 win+r 输入 certmgr.msc 查看
客户端证书
二级 CA 证书
根证书
现在证书已经导入,可以再访问下管理后台了,浏览器需要重新打开下
不知为啥,CA 根证书已经被信任,但是依然告警了,这里不管了,点击继续前往
这里会弹出证书选择窗口,选中证书即可登录
经过一番折腾,我的博客站点总算是安全了那么一点点。关于 openssl 制作证书,本文并未深入讲解,有空会再详细聊聊
猜你喜欢
- 2024-10-20 k8s安全认证 k8s认证cka
- 2024-10-20 Nginx配置HTTP Basic认证 nginx静态资源配置
- 2024-10-20 阿里云环境中TLS/SSL握手失败的场景分析
- 2024-10-20 开源 SSO 单点登录认证系统,支持与 Nginx 直接集成
- 2024-10-20 「Kubernetes」第九章:认证 kubernetes授权模块
- 2024-10-20 带你了解HTTPS(三):双向认证 https客户端认证
- 2024-10-20 Nginx okhttp 双向验证 配置 nginx反向代理http配置
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)