用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

时间:2022-09-25 09:28:09

用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

来源: https://www.cnblogs.com/osnosn/p/10597897.html 来自osnosn的博客

写于: 2019-03-27.

本文参考了大神的文章:

 搭建一个「最安全」的Wi-Fi网络楠站

本文是为"CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证" 中,WiFi的EAP-TLS认证,准备证书。

或者是为"Newifi OpenWrt 下 EAP-PEAP,EAP-TLS 企业级无线认证及 FreeRadius3" 中,WiFi的EAP-TLS认证,准备证书。

如果想为WEB服务器生成自签名证书,我补充了一篇笔记: "用openssl为WEB服务器生成证书"

我用的是openssl-1.0.2k.

脚本支持生成RSA,ECC证书。 运行时带参数指定类型。

-->开始。按以下路径建立文件,脚本。ssl_create-cert-v0.4.7z

ssl_create-cert/   <-- 这个目录, 自己随便取名
|_ 2db/0serial
|_ 2db/2indexdb.txt
|_ 3certs_new/
|_ 4export/
|_ clear_all_cert.sh
|_ copy-pem-to.sh
|_ create-crl.sh
|_ new-ca.sh
|_ new-server.sh
|_ new-user.sh
|_ revoke-user.sh
|_ user_certs/
|_ openssl.cnf
|_ README

mkdir 2db/

echo "2233AA1234" > 2db/0serial 证书序列号,自己随便编,十六进制数。

cat /dev/null > 2db/2indexdb.txt

此文件必须是0字节,否则openssl会报错

wrong number of fields on line 1 (looking for field 6, got 1, '' left)

mkdir 3certs_new 4export user_certs

clear_all_cert.sh

#!/bin/sh
# clear_all_cert.sh
if [ "$#" -ne 1 -o "$1" != "clearall" ]; then
echo "Usage: $0 clearall"
echo -e "\tClear all the \"keys\" and \"certs\"."
echo -e "\tIt will remove *.pem"
echo -e "\tIt will remove 3certs_new/* 4export/* user_certs/*"
echo -e "\tIt will remove ALL!!!!!"
exit 1
fi
if [ -f ca_key.pem ]; then
rm -f ca_key.pem ca_cert.pem ca_cert.txt
fi
if [ -f crl.pem ]; then
rm -f crl.pem ca_cert+crl.pem
fi
if [ -f server_key.pem ]; then
rm -f server_key.pem server_cert.pem
fi
if [ -d user_certs ]; then
rm -f user_certs/*
fi
if [ -d 3certs_new ]; then
rm -f 3certs_new/*
fi
if [ -d 4export ]; then
rm -f 4export/*
fi
if [ -f 2db/0serial ]; then
rm -f 2db/0serial.old
fi
if [ -f 2db/2indexdb.txt ]; then
cat /dev/null > 2db/2indexdb.txt
rm -f 2db/2indexdb.txt.attr 2db/2indexdb.txt.attr.old 2db/2indexdb.txt.old
fi
echo -e "ALL cert files removed."
echo "You may now run ./new-ca.sh to get start"
echo ""

copy-pem-to.sh

#!/bin/sh
# copy-pem-to.sh
DIR=$1
if [ "$#" -ne 1 -o "${#DIR}" -le "1" ]; then
echo "Usage: $0 dest_directory"
echo -e "\t $0 ./"
echo -e "\t $0 a/"
exit 1
fi
if [ ! -d $DIR ]; then
echo " \"$DIR\" directory not found. Exit."
exit 1
fi echo "copy \"ca_cert+crl.pem\" \"server_cert.pem\" \"server_key.pem\" to \"$DIR\""
cp -i ca_cert+crl.pem $DIR
cp -i server_cert.pem $DIR
cp -i server_key.pem $DIR

create-crl.sh

#!/bin/sh
#./create-crl.sh if [ ! -f ca_key.pem ]; then
echo "CA not found. Exit."
exit
fi
if [ -f crl.pem ]; then
echo "CRL file found. Exit."
exit
fi
openssl ca -gencrl -keyfile ca_key.pem -cert ca_cert.pem -out crl.pem -config openssl.cnf && \
cat ca_cert.pem crl.pem > ca_cert+crl.pem
echo "copy file \"server_cert.pem\" \"server_key.pem\" \"ca_cert+crl.pem\" to hostapd dir."
echo "And start service \"hostapd\"." echo ""

new-ca.sh

#!/bin/sh
# new-ca.sh
# Create the master CA key and cert. This should be done once.
if [ -f ca_key.pem ]; then
echo "Root CA key found. Exit."
exit
fi
keytype=""
case "$1" in
"rsa2048")
keytype="rsa:2048"
;;
"rsa4096")
keytype="rsa:4096"
;;
"ec256")
keytype="ec:ec_param"
openssl ecparam -name prime256v1 -out ec_param
;;
"ec384")
keytype="ec:ec_param"
openssl ecparam -name secp384r1 -out ec_param
;;
*)
echo -e "\nUsage: $0 {rsa2048|rsa4096|ec256|ec384}\n"
exit
;;
esac exportdir="4export" echo "Self-sign the root CA..."
echo "No Root CA key found. Generating one"
openssl req -x509 -nodes -days 36500 -newkey ${keytype} -keyout ca_key.pem -out ca_cert.pem -new -sha512 -config openssl.cnf -extensions v3_ca -utf8 -subj "/C=CN/ST=广东/L=gz/O=Home/CN=Wifi EAP Root CA/" && \
openssl x509 -outform der -in ca_cert.pem -out ./${exportdir}/CA.crt && \
openssl x509 -in ca_cert.pem -noout -text > ca_cert.txt
echo "You may now run ./new-server.sh"
echo ""

new-server.sh

#!/bin/sh
# new-server.sh
# Create the server key and cert.
if [ -f server_key.pem ]; then
echo "Server key found. Exit."
exit
fi
keytype=""
case "$1" in
"rsa2048")
keytype="rsa:2048"
;;
"rsa4096")
keytype="rsa:4096"
;;
"ec256")
keytype="ec:ec_param"
openssl ecparam -name prime256v1 -out ec_param
;;
"ec384")
keytype="ec:ec_param"
openssl ecparam -name secp384r1 -out ec_param
;;
*)
echo -e "\nUsage: $0 {rsa2048|rsa4096|ec256|ec384}\n"
echo "server证书建议用RSA。"
echo "ECC server证书会导致安卓无法连接。错误为\"no shared cipher\"."
exit
;;
esac echo "Create server ssl for hostapd."
echo "No Server key found. Generating one." openssl req -nodes -new -newkey ${keytype} -keyout server_key.pem -out server_csr.pem -config openssl.cnf -utf8 -subj "/C=CN/ST=广东/L=gz/O=Home/CN=WiFi Radius Server/" && \
openssl ca -days 36500 -in server_csr.pem -out server_cert.pem -config openssl.cnf -extensions server_cert -batch && \
rm -rf server_csr.pem
echo "You may now run ./create-crl.sh"
echo ""

new-user.sh

#!/bin/sh
# new-user.sh
# Create the user key and cert. This should be done once per cert.
if [ $# -lt 3 ]; then
echo -e "\nUsage: $0 {rsa1024|rsa2048|rsa4096|ec256|ec384} userName days [pass]\n days between 2 and 365\n"
exit 1
fi
CERT=$2
if [ -f user_certs/user_${CERT}_key.pem ]; then
echo "user_certs/user_${CERT}_key.pem found. Exit."
exit 0
fi
keytype=""
case "$1" in
"rsa1024")
keytype="rsa:1024"
;;
"rsa2048")
keytype="rsa:2048"
;;
"rsa4096")
keytype="rsa:4096"
;;
"ec256")
keytype="ec:ec_param"
openssl ecparam -name prime256v1 -out ec_param
;;
"ec384")
keytype="ec:ec_param"
openssl ecparam -name secp384r1 -out ec_param
;;
*)
echo -e "\nUsage: $0 {rsa1024|rsa2048|rsa4096|ec256|ec384} userName days [pass]\n days between 2 and 365\n"
exit
;;
esac DAYS=${3:-1} # default 1
if [ "${DAYS}" -gt 365 -o "${DAYS}" -lt 2 ]; then
if [ "${DAYS}" -ne 36500 ];then
echo -e "\nUsage: $0 {rsa1024|rsa2048|rsa4096|ec256|ec384} userName days [pass]\n days between 2 and 365\n"
exit 1
fi
fi PASS=${4:-123} # default 123 exportdir="4export" export RANDFILE=2db/.random_state
## win10连接EAP-TLS时强制使用用户证书的"CN="作为用户名。建议"CN="不要包含空格。
## freeradius3不允许用户名中包含空格。用hostapd做radius时用户名无此限制。
openssl req -nodes -new -newkey ${keytype} -keyout user_certs/user_${CERT}_key.pem -out user_certs/user_${CERT}_csr.pem -config openssl.cnf -utf8 -subj "/C=CN/ST=广东/L=gz/O=Home/CN=WiFi-${CERT}/" && \
openssl ca -days ${DAYS} -in user_certs/user_${CERT}_csr.pem -out user_certs/user_${CERT}_cert.pem -config openssl.cnf -extensions user_cert -batch && \
rm -rf user_certs/user_${CERT}_csr.pem && \
echo -e "Export certs...\n \"Export Password\" MUST set for IOS.\n \"Export Password\" MAY empty for Android,windows." && \
openssl pkcs12 -export -out ./${exportdir}/${CERT}.p12 -inkey user_certs/user_${CERT}_key.pem -in user_certs/user_${CERT}_cert.pem -certfile ca_cert.pem -caname "Wifi EAP RootCA" -name "${CERT}-wifi-user" -passout pass:${PASS}
# 友好名称 "-name" "-caname" windows中不支持utf8中文 echo ""

revoke-user.sh

#!/bin/sh
# revoke-user.sh
CERT=$1
if [ $# -ne 1 ]; then
echo "Usage: $0 userName"
exit 1
fi
if [ ! -f user_certs/user_${CERT}_key.pem ]; then
echo "user_certs/user_${CERT}_key.pem NOT found. Exit."
exit 0
fi openssl ca -revoke user_certs/user_${CERT}_cert.pem -config openssl.cnf && \
openssl ca -gencrl -keyfile ca_key.pem -cert ca_cert.pem -out crl.pem -config openssl.cnf && \
cat ca_cert.pem crl.pem > ca_cert+crl.pem
echo "You NEED update \"ca_cert_crl.pem\" file and restart service \"hostapd\"." echo ""

chmod +x clear_all_cert.sh new-ca.sh new-server.sh create-crl.sh copy-pem-to.sh new-user.sh revoke-user.sh

openssl.cnf

#openssl.cnf
[ ca ]
default_ca = hostapd [ hostapd ]
dir = .
serial = $dir/2db/0serial
database = $dir/2db/2indexdb.txt
new_certs_dir = $dir/3certs_new
certificate = $dir/ca_cert.pem
private_key = $dir/ca_key.pem
RANDFILE = $dir/2db/.random_state default_bits = 4096
default_days = 36500
default_crl_days = 36500
default_md = sha512
#unique_subject = no policy = policy_anything [ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional [ req ]
distinguished_name = req_distinguished_name
string_mask = utf8only
[ req_distinguished_name ] [ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:true
certificatePolicies=ia5org,@pl_section
[ server_cert ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:false
extendedKeyUsage = serverAuth,msSGC,nsSGC
certificatePolicies=ia5org,@pl_section
[ user_cert ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:false
#subjectAltName = email:copy
extendedKeyUsage = clientAuth,emailProtection,timeStamping
certificatePolicies=ia5org,@pl_section [ pl_section ]
policyIdentifier = "X509v3 Any Policy"
# 颁发者说明的链接. windows中,要导入信任之后才生效.
CPS.1 = https://your.web.com/cps/readme.html
userNotice.1=@pl_notice
[ pl_notice ]
# 颁发者说明,Issuer statment. 不支持utf8中文,因为ia5org。
explicitText="Read deail at https://your.web.com/xxx.html"

userNotice.1 的文字说明,只能是英文,中文会乱码。

文字说明,无论此证书是否被系统信任,查看证书时都会出现在"颁发者说明"中(Issuer Statement)。

CPS.1 的链接。系统未信任此证书时,是不显示的。信任后,才会出现在"颁发者说明"中(Issuer Statement)。

CPS.1= 可以是 "http://" 也可以是 "https://"。

用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)

README

README
create by osnosn, 2019-03-20. version_0.2.
--------------
To clear all:
./clear_all_cert.sh Certs for hostapd:
modify C/ST/L/O/CN in new-ca.sh,new-server.sh,newuser.sh, 可以使用中文。
modify openssl.cnf:
CPS.1=
explicitText=
keytype: rsa2048, rsa4096, ec256, ec384.
./new-ca.sh
./new-server.sh
./create-crl.sh
copy file "server_cert.pem" "server_key.pem" "ca_cert+crl.pem" to hostapd dir.
./copy-pem-to.sh
And start service "hostapd". Certs for user:
./new-user.sh Revoke user:
./revoke-user.sh
After revoke, replace file "ca_cert+crl.pem" and reload "hostapd".
--------------
server cert: ECC 会导致Android8 连接失败, 错误为"no shared cipher"。建议用RSA。
ca, user cert 可以用ECC。
user cert in "user_certs/" and "4export/"
import "4export/xxx.p12" to android,ios,windows client.
用户证书 xxx.p12 在 "4export/" 目录中,
一个p12文件包含ca证书,user证书,user密钥三个内容。
android,windows可以一次导入三个内容。
ios会丢弃ca。 ios导入密钥强制输入加密密码(密码不能为空)。
android,windows导入密钥可以接受空密码。 windows 必须导入"当前用户",否则连接wifi时不能识别证书。
windows连接EAP-TLS: 点击搜索到的wifi ssid,出现输入"用户","密码"时,点击"用证书认证"(证书导入当前用户后)。
---------

chmod +x clear_all_cert.sh new-ca.sh new-server.sh create-crl.sh copy-pem-to.sh new-user.sh revoke-user.sh

给android导入用户证书一定要用p12格式,不能用pem格式。

Android不认pem格式中的密钥,只认公钥。导致没密钥不能用于连接WIFI。

使用方法:

修改 C=/ST=/L=/O=/CN= 的内容合适你自己。这些项可以使用中文。

修改 openssl.cnf 中 CPS.1= 和 explicitText= 。

在IOS,windows中可以看到,可以写漂亮点。主要是CN=写漂亮点。会显示为证书名。

Android没地方看证书描述。写啥,Android都看不到。

./clear_all_cert.sh clearall

./new-ca.sh ec256

./new-server.sh rsa2048 #服务器证书建议用RSA

./create-crl.sh

./copy-pem-to.sh hostapd_conf_dir/

service restart hostapd

./new-user.sh ec256 user1 36500

./new-user.sh ec256 user2 36500

copy xx.p12 file from "4export/" 目录,分发给用户。

转载请注明来源。

来源: https://www.cnblogs.com/osnosn/p/10597897.html 来自osnosn的博客

---------------end---------------

用openssl为EAP-TLS生成证书(CA证书,服务器证书,用户证书)的更多相关文章

  1. 使用 OpenSSL 创建私有 CA:3 用户证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...

  2. GMSSL中生成SM2或RSA1024或RSA2048的证书相关命令

    1.生成KEY:gmssl sm2 -genkey -out 01.root.pemgmssl genrsa -out 01.root_plain.key 2048gmssl genrsa -out ...

  3. NET Core Kestrel部署HTTPS 一个服务器绑一个证书 一个服务器绑多个证书

    .net core 3.0 网站发布到centos后,绑定ssl证书,一个服务器绑一个证书,一个服务器绑多个证书 开始之前:对于windows服务器不存在这个问题,在iis中绑定证书是非常简单的一件事 ...

  4. https学习笔记三----OpenSSL生成root CA及签发证书

    在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...

  5. OpenSSL生成root CA及签发证书

    一.openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用.健壮.功能完备的工具套件,用以支持SSL/TLS 协议的实现.官网:https://www.openss ...

  6. openssl 自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书

    server { listen 80; listen 443 ssl; server_name ~^((cloud)|(demo-cloud)|(demo2-cloud)|(approval1))(( ...

  7. OpenSSL 1&period;0&period;0生成p12、jks、crt等格式证书的命令个过程&lpar;转&rpar;

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

  8. openssl实现双向认证教程(服务端代码&plus;客户端代码&plus;证书生成)

    一.背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击. <信息安全工程>中接触过 ...

  9. OpenSSL 1&period;0&period;0生成p12、jks、crt等格式证书的命令个过程 -参考自http&colon;&sol;&sol;lavasoft&period;blog&period;51cto&period;com&sol;62575&sol;1104993&sol;

    OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程   此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘!     1.创建根证私钥命令:openssl g ...

随机推荐

  1. JVM的GC概述

    JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序 ...

  2. ios-消息弹框之UIAlertView&comma; UIActionSheet以及UIAlertController小结

    首先storyboard中创建对应按钮并拖线,来演示不同的效果 首先点击了actionSheet按钮效果如图 实现弹框需要遵守设置代理,遵守协议. 效果就是从底部向上弹起来的框框. 通过对按钮的点击输 ...

  3. PHP MSSQL数据操作PDO API

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  4. if语句之求一元二次方程

    思路:1.首先明白什么叫做一元二次方程,当a不等于0的时候,此方程是一元二次方程 2.根据公式derta=b*b-4*a*c来判断根的情况 ①derta>0时,方程有两个不相等的实根 ②dert ...

  5. 部署statspack工具(一)

    禁用sga自动管理机制,分配比较小的数据缓冲区(30m)和共享池(70m)空间 1.1关闭SGA自动管理机制 查看是否开启了ASSM idle>show parameter sga; NAME  ...

  6. vue-cli3&period;0

    vue-cli 都到 3.0.3 了,所以是时候玩转一下 vue-cli 3 的新特性. 1. vue-cli 3.0.3 vue cli 的包名称由 vue-cli 改成了 @vue/cli. 如果 ...

  7. (转)GPU图形绘制管线

    摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第二章. 图形绘制管线描述GPU渲染流程, ...

  8. IOS多线程处理

    http://www.jianshu.com/p/0b0d9b1f1f19 首页专题下载手机应用 显示模式登录     注册登录 添加关注 作者 伯恩的遗产2015.07.29 00:37* 写了35 ...

  9. 在sublime text 3中让&period;vue文件的内容变成彩色

    直接上步骤: 1.按住ctrl + shift + p 2.输入install Package 3.输入Vue Syntax Highlight 执行完以上3步,再次打开.vue文件,会发现里面的内容 ...

  10. 一、final关键字

    final关键字修饰:类,方法,基本类型变量,引用,具有不同的意思 1.final修饰类 表示该类不能被继承 package property; public final class Hero ext ...