Skip to content

Instantly share code, notes, and snippets.

@ixqbar
Last active September 10, 2018 01:48
Show Gist options
  • Save ixqbar/b5332a5336e248fb0687ac861486d835 to your computer and use it in GitHub Desktop.
Save ixqbar/b5332a5336e248fb0687ac861486d835 to your computer and use it in GitHub Desktop.
openssl使用

###产生1024位RSA私匙,用3DES加密它,口令为trousers,输出到文件rsaprivatekey.pem

openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

###从文件rsaprivatekey.pem生成的公钥匙输出到文件rsapublickey.pem

openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

###用公钥匙rsapublickey.pem加密文件plain.txt,输出到文件cipher.txt

openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt
  • 公钥加密

###使用私钥匙rsaprivatekey.pem解密密文cipher.txt,输出到文件plain.txt

openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt
  • 私钥解密

###用私钥匙rsaprivatekey.pem给文件plain.txt签名,输出到文件signature.bin

openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin
  • 私钥签名

###用公钥匙rsapublickey.pem验证签名signature.bin,输出到文件plain.txt

openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain
  • 公钥验证私钥签名合法性

###从X.509证书文件cert.pem中获取公钥匙,用3DES加密mail.txt 输出到文件mail.enc

openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

S/MIME[Secure Multipurpose Internet Mail Exchange]
S/MIME应用于安全邮件交换,可用来认证和加密,是PGP的竞争对手。与PGP不同的是,它需要一套公匙体系建立信任关系,而PGP只需直接从某个地方获取对方的公匙就可以。然而正因为这样,它的扩展性比PGP要好。另一方面,S/MIME可以对多人群发安全消息,而PGP则不能。 命令smime可用来加解密、签名、验证S/MIME v2消息(对S/MIME v3的支持有限而且很可能不工作)。对于没有内置S/MIME支持的应用来说,可通过smime来处理进来(incoming)和出去(outgoing)的消息。

###从X.509证书文件cert.pem中获取接收人的公钥匙,用私钥匙key.pem解密S/MIME消息mail.enc,结果输出到文件mail.txt

openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

###cert.pem为X.509证书文件,用私匙key,pem为mail.txt签名,证书被包含在S/MIME消息中,输出到文件mail.sgn

openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

###验证S/MIME消息mail.sgn,输出到文件mail.txt签名者的证书应该作为S/MIME消息的一部分包含在mail.sgn中

openssl smime -verify -in mail.sgn -out mail.txt
@ixqbar
Copy link
Author

ixqbar commented Nov 4, 2016

去除掉密钥文件保护密码
openssl rsa -in rsaprivatekey.pem -out rsaprivatekey.pem

@ixqbar
Copy link
Author

ixqbar commented Nov 4, 2016

  • openssl genrsa 命令生成新的RSA私匙,推荐的私匙长度为1024位,不建议低于该值或者高于2048位
  • 缺省情况下私匙不被加密,但是可用DES、3DES或者IDEA加密
  • openssl rsa 命令可用来添加、修改、删除私匙的加密保护,也可用来从私匙中生成RSA公匙,或者用来显示私匙或公匙信息
  • openssl rsautl命令提供RSA加密和签名功能。但是不推荐用它来加密大块数据,或者给大块数据签名,因为这种算法的速度较来慢。通常用它给对称密匙加密,然后通过enc命令用对称密匙对大块数据加密

@ixqbar
Copy link
Author

ixqbar commented Nov 4, 2016

x509证书一般会用到三类文件,key,csr,crt。
Key 是私用密钥,openssl格式,通常是rsa算法。
csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证

*.key:密钥文件,一般是SSL中的私钥;
*.csr:证书请求文件,里面包含公钥和其他信息,通过签名后就可以生成证书;
*.crt, *.cert:证书文件,包含公钥,签名和其他需要认证的信息,比如主机名称(IP)等。
*.pem:里面一般包含私钥和证书的信息。

###生成key

openssl genrsa -des3 -out server.key 2048
//也可以取消上面要求输入的密码
openssl rsa -in server.key -out server.key  

###生成csr

openssl req -new -key server.key -out server.csr
  • 需要输入国家,地区,组织,email等信息
  • 最重要的是,有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。
  • 生成的csr文件交给CA签名后形成服务端自己的证书crt

###自己充当CA角色生成crt

####首先需要生成CA角色需要的ca.crt

openssl req -new -x509 -key server.key -out ca.crt -days 3650 

####利用上面的ca.crt签名

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt 
  • CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
  • -CA选项指明用于被签名的csr证书
  • -CAkey选项指明用于签名的密钥
  • -CAserial指明序列号文件,而-CAcreateserial指明文件不存在时自动生成

@ixqbar
Copy link
Author

ixqbar commented Nov 8, 2016

ASN.1 提供了抽象语法,类似于编程语言中的关键字。
X.509 是使用这些抽象语法定义了证书的数据结构和编码规范。
PEM是将X.509基础证书用base64重新编码存为ASCII文件,用于和邮件一起传输保证邮件安全性。
PKCS是美帝RSA公司制定的一系列规范,#7/#12对基础X.509证书和证书对应的私钥进行扩充、加密、重新编码后用于交换,#8定义了一种私钥格式标准。

@ixqbar
Copy link
Author

ixqbar commented Nov 21, 2016

https

openssl genrsa -out client.key 2048
openssl req -new -x509 -key client.key -out client.pem -days 3650

查看证书

openssl x509 -in server.pem -inform pem -noout -text

test

package main

import (
	"flag"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
)

func httpServer(w http.ResponseWriter, req *http.Request) {

	for k, v := range req.Header {
		fmt.Printf("%s: %s\n", k, v)
	}
	fmt.Printf("Host: %s\n", req.Host)
	fmt.Printf("URL: %s\n", req.URL.String())
	fmt.Printf("Content-Length: %d\n", req.ContentLength)
	fmt.Println()
	if req.ContentLength > 0 {
		var content, err = ioutil.ReadAll(req.Body)
		if err == nil {
			fmt.Print(string(content))
		} else {
			fmt.Print(content)
		}
	}

	io.WriteString(w, "OK\n")
}

func main() {
	var port = flag.Int("port", 8000, "port default 8000")

	flag.Parse()

	fmt.Printf("running at port %d", *port)

	http.HandleFunc("/", httpServer)
	err := http.ListenAndServeTLS(fmt.Sprintf(":%d", *port), "server.pem", "server.key", nil)
	checkError(err)
}

func checkError(err error) {
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
		os.Exit(1)
	}
}

@ixqbar
Copy link
Author

ixqbar commented Sep 10, 2018

生成nginx ssl

openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment