通过抓包学习ssl:https://www.cnblogs.com/xiaxveliang/p/13183175.html
通过openssl学习ssl:http://3ms.huawei.com/km/blogs/details/1809919
ssl会话复用:https://cloud.tencent.com/developer/article/1819517
证书格式转换:https://blog.csdn.net/ctwy291314/article/details/80017639
加密 → 解密,其实就是将原来的明文文件,使用某种算法,进行计算,得到一段不可读的数据:“密文”,是用来保护数据的,保证数据不被非法窃取。

生成RSA秘钥的方法:
openssl genrsa -des3 -out privkey.pem 2048
注:建议用2048位秘钥,少于此可能会不安全或很快将不安全。
这个命令会生成一个2048位的秘钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成:openssl genrsa -out privkey.pem 2048
openssl req -new -key privkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成秘钥privkey.pem文件,这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 3650
这个命令将用上面生成的秘钥privkey.pem生成一个数字证书cacert.pem
以上步骤或直接使用一个命令即可:openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout privkey.pem -out cacert.pem -days 3650
server {
listen 443 ssl;
server_name www.a.com;
charset utf-8;
#access_log /var/log/nginx/host.access.log main;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /etc/nginx/cacert.pem;
ssl_certificate_key /etc/nginx/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers *;
add_header Access-Control-Allow-Credentials true;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
# location / {
# proxy_pass http://xxx:8081/a;
# proxy_redirect off;
# 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 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
在nginx中,ssl_protocols表示支持的SSL/TLS协议版本。SSL/TLS是一种加密协议,用于保证客户端和服务器之间的通信安全。ssl_protocols指定了nginx服务器支持的SSL/TLS协议版本,可以设置多个协议版本,以逗号分隔。常见的SSL/TLS协议版本包括:
TLSv1.2:TLS版本1.2,是TLSv1.1的升级版,目前被视为最安全的TLS协议版本。
TLSv1.3:TLS版本1.3,是TLSv1.2的升级版,提供更快的握手速度和更好的安全性。
在nginx中,可以使用ssl_protocols指定支持的SSL/TLS协议版本,例如:
ssl_protocols TLSv1.2 TLSv1.3;
这表示nginx服务器只支持TLSv1.2和TLSv1.3两个协议版本,如果客户端使用其他版本的协议进行连接,则会被服务器拒绝。通过设置ssl_protocols,可以提高通信的安全性和可靠性。
openssl rsautl -encrypt -inkey privkey.pem -in password.txt -out password.enc
openssl rsautl是OpenSSL中一个用于RSA加密、解密、签名和验证的命令行工具。其中,
rsautl是RSA utility的缩写,用于执行RSA算法相关的操作。
-encrypt选项表示使用RSA算法进行加密操作。
-inkey privkey.pem表示使用指定的私钥文件private.key来加密数据。
-in password.txt表示将要加密的数据来源于文件password.txt,就是明文。
-out password.enc表示加密后的数据将保存到文件password.enc中。
RSA算法是一种非对称加密算法,使用公钥加密,私钥解密。在使用RSA算法进行加密操作时,数据被加密后只能由私钥持有者解密:使用私钥privkey.pem对密码文本password.txt进行加密,生成加密后的文件password.enc。接收者可以使用相应的公钥进行解密。需要注意的是,在实际应用中需要对私钥进行保护,避免私钥泄露或被恶意使用,从而导致数据泄露或被篡改。
openssl rsautl -decrypt -inkey privkey.pem -in password.enc -out password_decrypted.txt

生成私钥:
openssl genrsa -out suprivate.pem 2048
生成公钥:
openssl rsa -in suprivate.pem -outform PEM -pubout -out supublic.pem
openssl rsautl -encrypt -inkey supublic.pem -pubin -in text.txt -out test.txt.encry
openssl rsautl -decrypt -inkey suprivate.pem -in test.txt.encry -out decrypted.txt
验证CA证书的有效性
openssl verify ca.crt
该命令将验证CA证书是否已被颁发,是否已过期,是否被吊销等。
2. 验证服务器证书和私钥的匹配性
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
这两个命令将计算服务器证书和私钥的modulus值,并对其进行哈希。如果两个哈希值相同,则证明服务器证书和私钥是匹配的。
3. 验证服务器证书的有效性
openssl verify server.crt
该命令将验证服务器证书是否已被颁发,是否已过期,是否被吊销等。
4. 验证服务器证书和公钥的匹配性
openssl x509 -noout -pubkey -in server.crt > pubkey.pem
openssl rsa -noout -pubin -in server.key > privkey.pem
openssl pkey -pubin -in pubkey.pem -check -noout
openssl pkey -pubin -in privkey.pem -check -noout
这四个命令将提取服务器证书和私钥中的公钥,并验证它们是否匹配。
如果以上所有命令都没有报错,则说明CA证书、私钥、公钥之间是有效的。
unable to load Public Key错误可能是因为cacert.pem文件中的公钥格式不正确。请确保cacert.pem文件中的公钥格式是正确的PEM格式,并且包含BEGIN PUBLIC KEY和END PUBLIC KEY标识。
如果您不确定cacert.pem文件中的公钥格式是否正确,可以使用以下命令来查看公钥内容:
openssl pkey -in cacert.pem -pubin -text
如果输出结果中包含BEGIN PUBLIC KEY和END PUBLIC KEY标识,并且公钥内容正确,则可以尝试重新运行加密命令:
openssl rsautl -encrypt -in plain.txt -inkey cacert.pem -pubin -out plain.txt.encrypt
如果问题仍然存在,请检查cacert.pem文件路径是否正确,并确保文件具有正确的文件权限。
error 18 at 0 depth lookup: self signed certificate
error ca.crt: verification failed
答:这个错误提示是因为 ca.crt 是自签名证书,openssl 默认情况下不信任自签名证书,需要手动添加信任。在执行 openssl verify 命令时,openssl 会尝试使用系统中可用的根证书来验证指定的证书,如果找不到合适的根证书,则会报错。使用 -CAfile 或 -CApath 选项指定可信任的证书,这样 openssl 就可以使用这些证书来验证指定的证书。例如:
openssl verify -CAfile ca.crt server.crt
证书链(Certificate Chain),也被称为证书路径,是由多个证书组成的一种结构。在 SSL/TLS 协议中,证书链用于验证服务器证书的有效性,以及确认服务器是否可信。
证书链通常由以下几个部分组成:
(1)服务器证书:即服务器的公钥证书,由 CA 颁发,用于证明服务器的身份和公钥信息。
(2)中间证书:如果服务器证书由中间 CA 颁发(实际场景服务证书都是中间CA颁发),则需要包含中间证书。中间证书由下级 CA 颁发,用于证明服务器证书的合法性和信任度。
(3)根证书:根证书是证书链的根节点,也是信任链的最终节点。根证书是由操作系统或浏览器预置的一组受信任的证书,用于验证服务器证书和中间证书的合法性和信任度。
在 SSL/TLS 握手过程中,服务器会将证书链发送给客户端,客户端会根据证书链验证服务器证书的有效性,并确认服务器是否可信。如果证书链中的任何一个证书无效或不可信,则 SSL/TLS 握手将失败,连接将被终止。因此,证书链对于 SSL/TLS 安全连接的建立至关重要。
实际证书申请中,由于权威的CA机构数量不多,若所有的服务器证书都向权威CA机构申请,那么CA机构的工作量就会非常大。因此CA机构采取授权 二级机构的方式来管理证书申请,经授权的二级机构也可以签发服务器证书。这里的CA 机构就是颁发根证书,中间证书则由二级机构颁发

为什么要进行base64编码呢?一般是因为二进制进行数据传输时,网络中间的有些路由会把 ascii 码中的不可见字符删除,导致数据不一致,因此一般会进行 url 进行 base64编码。
utf-8 -> base64(编码) -> ASCII
两种编码方式:
echo -n 'Hello World!' | base64
cat ca.crt | base64 -w0
cat ca.crt | base64 -w0是将文件ca.crt进行base64编码的命令,具体解释如下:
cat ca.crt:使用cat命令读取ca.crt文件的内容,并将其输出到标准输出中。
|:管道符号,将cat命令的输出作为输入传递给base64命令。
base64:将输入内容进行base64编码。
-w0:指定输出行的最大宽度为0,表示不限制输出行的长度。如果不指定该选项,则默认每行输出76个字符,如果数据量较大则可能会造成显示问题。
因此,cat ca.crt | base64 -w0的含义是将文件ca.crt的内容进行base64编码,并将编码结果输出到标准输出中,每行输出的字符数不限制。
ASCII -> base64(解码) -> utf-8
这就为什么url在请求过程中需要进行base64编码了。
echo -n 'SGVsbG8gV29ybGQh' | base64 -d
私钥签名
openssl dgst -sha1 -sign RSAPrivateKey.pem -out sign.txt.signed sign.txt
公钥验签
openssl dgst -sha1 -verify RSAPublicKey.pem -signature sign.txt.signed sign.txt
发送者使用可以代表自己身份的私钥进行签名。
接受者使用私钥对应的公钥进行验签。这样就实现了对消息发送者身份的验证。
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
从MB升级到新的MBP后,Apple的迁移助手没有移动我的gem。我这次是通过macports安装rubygems,希望在下次升级时避免这种情况。有什么我应该注意的陷阱吗? 最佳答案 如果你想把你的gems安装在你的主目录中(在传输过程中应该复制过来,作为一个附带的好处,会让你以你自己的身份运行geminstall,而不是root),将gemhome:键设置为您在~/.gemrc中的主目录中的路径. 关于通过MacPorts的RubyGems是个好主意吗?,我们在StackOverf
当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否