使用OpenSSL实现CA证书的搭建过程

个人博客地址:http://www.pojun.tech/ 欢迎访问

什么是CA

CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书(也就是服务端证书,由域名,公司信息,序列号,签名信息等等组成)来加强客户端与服务器端访问信息的安全性,同时提供证书的发放等相关工作。国内的大部分互联网公司都在国际CA机构申请了CA证书,并且在用户进行访问的时候,对用户的信息加密,保障了用户的信息安全。理论上来说,任何组织或者个人都可以扮演CA的角色,只不过,难以得到客户端的信任,不能推而广之,最典型应用莫过于12306网站,这个网站就是自己给自己颁发的根证书。
目前能够让浏览器默认支持的CA大厂有很多,Windows 操作系统在安装之初,也默认安装了很多受信任的根证书。可以通过控制面板–Internet选项来进行查看。

windows默认安装的根证书预览

SSL/TLS

SSL/TLS是网络通信过程中非常重要的两个协议。互联网的通信安全就建立在SSL/TLS协议基础之上。他们通过一系列的加密行为保障了通信的安全,是如今互联网通信最主要的应用之一。

SSL/TLS是一个很大的互联网应用,关于他们的介绍互联网上有很多,我们暂时不做详细的介绍。关于SSL/TLS通信的过程大致可以用下面的这张图来进行描述。

SSL/TLS通信示意图

OpenSSL

OpenSSL是一套开源软件,在Linux中可以很容易的安装。它能够很容易的完成密钥生成以及证书管理。我们接下来就利用OpenSSL搭建CA证书,并实现证书的申请与分发。

OpenSSL实现CA证书的搭建

  • 实验环境的准备

  • CA的配置介绍

  • 创建所需要的文件

  • CA 自签名证书

  • 颁发证书

  • 查看证书状态

  • 证书吊销

实验环境的准备

首先我们应该准备三个虚拟机,他们分别用来表示根CA证书机构,以及子CA证书机构,和证书申请用户。 那么问题来了,用户向子CA证书机构申请证书,子CA机构向根CA机构申请授权,根CA是如何取得证书的呢?答案是根CA自己给自己颁发的证书。 实验环境的拓扑结构如下图所示。

实验拓扑图

CA配置介绍

要手动创建CA证书,就必须首先了解,OpenSSL中关于CA的配置,配置文件位于下面的/etc/pki/tls/openssl.cnf

####################################################################
[ ca ]
default_ca= CA_default		#默认CA
####################################################################
[ CA_default ]
dir=/etc/pki/CA		 # CA的工作目录这里其实是定义了一个变量
certs= $dir/certs        # 证书存储路径
crl_dir= $dir/crl	 # 证书吊销列表
database= $dir/index.txt # 证书数据库列表new_certs_dir= $dir/newcerts	#新的证书路径
certificate= $dir/cacert.pem 	# CA自己的证书
serial= $dir/serial 		#下一个证书的编号,十六进制,默认00
crlnumber= $dir/crlnumber	#下一个要被吊销的证书编号,十六进制,默认00
crl= $dir/crl.pem 		# The current CRL
private_key= $dir/private/cakey.pem # CA 的私钥
RANDFILE= $dir/private/.rand	# private random number file
x509_extensions	= usr_cert	# The extentions to add to the cert# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default		# 命名方式
cert_opt = ca_default		# CA的选项# Extension copying option: use with caution.
# copy_extensions = copy# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions= crl_ext
default_days= 365			# 默认证书的有效期限
default_crl_days= 30			# how long before next CRL
default_md= default		# use public key default MD
preserve= no			# keep passed DN ordering# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy= policy_match  	#策略#这里记录的是 将来CA在搭建的时候,以及客户端申请证书的时候,需要提交的信息的匹配程度。# For the CA policy
[ policy_match ]			# match意味着CA以及子CA必须一致
countryName	= match			# 国家
stateOrProvinceName= match		# 州或者省
organizationName= match			#组织公司
organizationalUnitName	= optional
commonName= supplied
emailAddress= optional# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]		#可以对外提供证书申请,这时,证书的匹配就可以不用那么严格
countryName= optional
stateOrProvinceName= optional
localityName= optional
organizationName= optional
organizationalUnitName= optional
commonName= supplied
emailAddress= optional

创建所需要的文件

这里有一点需要注意,我们的实验环境中包含了三个主机,其中两个的角色是作为CA认证机构存在的,所以创建所需要的文件的时候,主机A和主机B都需要创建。 如果不提前创建这两个文件,那么在生成证书的过程中会出现错误。 我们将文件创建在配置文件中指定的路径下面。

  • 生成证书索引数据库文件 touch /etc/pki/CA/index.txt

  • 指定第一个颁发证书的序列号 echo 01 > /etc/pki/CA/serial

CA 自签名证书(构造根CA)

首先构造根CA的证书。因为没有任何机构能够给根CA颁发证书,所以只能根CA自己给自己颁发证书。

首先生成私钥文件

私钥文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私钥文件的同时最好修改该文件的权限,并且采用加密的形式进行生成。

# 执行命令生成私钥文件。
# 采用了des3的方式对私钥文件进行了加密
# 同时临时指定了umask ,使得生成的私钥文件只对自己具有读写权限。
[root@localhost ~]#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048 )
Generating RSA private key, 2048 bit long modulus
...............+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for /etc/pki/CA/private/cakey.pem:	#这里需要输入密码
Verifying - Enter pass phrase for /etc/pki/CA/private/cakey.pem:	#这里确认密码#  查看一个生成的私钥文件,就会发现已经被加密了
[root@localhost ~]#cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A4FB61EACD1544F29JrKVEPhnWhx1W+W1V4PdIvVHNDwb8mb0JYILvXZKc07gvNcYKIlvUoTxjtihbpk
wYQcVm0Z6b2+fjZBXVVR9igFB2OOE74BnSNMsbfPTs5W/SwWLxv0R6x0SbiZ8v/7
D6Qh3u/rXmOQWWTvQnLzh6JaT00c8zgUnn48vMev17Xyg32oJqKqJVL5RNBGmJur
6CaWX8mB5q+HYiBUXzNLQp9T3HNGcnmDNyk0gylEvjeJo3Hq+IOAkjfJE4sYO9ER
tQtsLViFUc5jXX7p0nIO0ANwE7zdjBt9I4aXknZiC4rFYJJtNSa1Wrhoo/MhuwWH
zjc4UyoB1C71sbq2LMgeElHhXN/TfqWGfXFqhkyBJwgrmzQibOJSFeWHZNurILof
UwgNLlABmazvIL5Ps6LgZtyrO2ODSDTzPiCO7kQ0S3mTHYk9+WEeEyMb4uum6oAx
oCofADL0wea+5mHVUA2s6KwRBFr01HiQ00fiul6LFvXdCwt9IL62blIJYn2veQHl
oPvC5cTnPVqJ28GJWbPvJjiOLB8Hh+4DPwxaRA1eYf2R9SR0R1SYJIBTI6NNqNwW
Lq+pD89bGCbFdYID+kAZfG27FonmmLvvhTn3jQKVPpwQBROHQ9gpwMLnpmpJWwNK
byUSit+Vt+mvbzOLjuTdsTzklwZEOkNpaE/jTqusWuhXS33D4bqA+Ws+xNVDnx6e
rbrGcbX9skXyti21oEIYem0H37ZS2fV9z+/CM/55maOX5xNVQ4aDxWuiMyyUd03D
nhhM5A4mcDvIZLpWDbHzjtkl2H9Pnb9fvGzOIOm7lVQrX8BdidpWjwGTLYG/zUX5
i9NimSnoiqgkhEYl8KXzbnMfD4hX69BXI7le5HAaS38wDKPsmRRW/dgGfRNKzfTZ
qmBimscMsllz21QnG9eqineFDdexGZw1oEQsHp2CivtEwaIKTqOZfNiwHJvm1cbz
M0NOgs+r2qze0czV9dTqM5pVND1Iac1DXYflYZ9g54riQNre/sHp1qpdNQHRRMTP
yTFnGsEfWmI4V4HiSrdQpyHIrnFUryse9kJmRKDfQK7icUf5/KrOD4FOS5zsHrep
/cE14w7s0Zqko9upkYQNBys5TbBmAK8yVJ/Zq7jU3qjDxkYNddpOt8k33vl9CG53
OeWxcWOzJCHIOjakJlLnS+XitsSY4hzUlfEO0/Ffi99zyHXybNPws5Og4KNfgcqW
ReG943oKc5qplfST2tr0K10ipD3WoV+lMbLugrwhfmVOyHGypfJhUMU0oKEjYPP3
JjHSiW0hrnNvrPQ4/mqSps3LyWYZWvH40N88U6dbxgbUgamXLHWtzJdyfBNii8uH
obtye7oeYpAzx0hNurXhpSoswFbxwU5u80eL0/YkfkzkL1P9vtMvDUw/TVNbwHVg
kTS9WEQA52XLMBtanzRzLGJVIXX6ODGgXt2Gql3KO1p43OyZq4Ksvyj8NuvdmBdO
y9SrMvv+cdOMmTkj4nmGBjqSDeFmrSSQf0HoUbfXXXw/RIW/gkcm4qPmNJXUolYp
WBOg5jT78pcJ2sRwb6YQDgC5HleBwuZujixUlKgdZxF1DEpJNBFnNDxq8yKadEzB
-----END RSA PRIVATE KEY-----

生成自签名证书

私钥文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私钥文件的同时最好修改该文件的权限,并且采用加密的形式进行生成。

# 调用命令生成一个签名证书
# 生成证书的过程中需要输入之前设定的私钥的密码
# -new: 生成新证书签署请求
# -x509: 专用于CA生成自签证书
# -key: 生成请求时用到的私钥文件
# -days n:证书的有效期限
# -out /PATH/TO/SOMECERTFILE: 证书的保存路径
[root@localhost ~]#openssl req -new -x509 -key  /etc/pki/CA/private/cakey.pem -days 7300 -out  /etc/pki/CA/cacert.pem
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
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) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ca.pojun.tech
Email Address []:

颁发证书

颁发证书这里我们将分成两个环节介绍,分别是 子CA证书机构向根CA证书机构申请证书以及普通用户向子CA证书机构申请证书。

子CA证书机构向根CA申请证书

A 在需要使用证书的主机上生成证书请求

首先在B主机上生成私钥,这一个过程与前面根CA机构生成私钥的过程是一致的。

# 这次我们修改了私钥的长度
# 并且没有采用加密的方式生成
# 因为主机B是要作为子CA机构的形式存在,他也是一个CA,所以生成私钥的时候,就应该按照配置文件中指定的内容,生成cakey.pem
[root@centos6 pki]$(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 1024)
Generating RSA private key, 1024 bit long modulus
......++++++
..............++++++
e is 65537 (0x10001)# 查看私钥文件可以发现,没有了加密的标识
# 同时因为生成时指定了1024的长度,私钥的长度明显的变短了。
[root@centos6 ~]$cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCxLyAKQCkysisrsuou6oJFJHs/Gk9L406x6sON1a2JX3516FJ2
·····中间省略······
R1ogCVEZq36sgNYUwaT55gLKk5Ik5T6YQimy0bsvo5oQuw==
-----END RSA PRIVATE KEY-----

利用私钥文件,生成证书申请文件。

# 其实这里的时间是没有必要指定的。
# 因为证书的时间,是由颁发机构指定的,因此申请机构填写了时间也没用
# 其中有些信息必须要与根证书的内容相同因为在根证书的openssl.cnf文件中已经指定。
[root@centos6 tls]$openssl req -new -key /etc/pki/CA/private/cakey.pem  -days 3650 -out /etc/pki/tls/subca.csr
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) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:subca.pojun.tech     
Email Address []:# 这里的两步 默认也可以不用填
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:magedu.com

B 将证书的申请文件,传递给根CA

将前一步生成的证书的申请文件,传递给根CA机构

# 最好将申请文件,传输到指定的目录下,这样便于管理
[root@centos6 tls]$scp /etc/pki/tls/subca.csr  172.18.253.127:/etc/pki/CA

C CA颁发证书

此时切换到根CA主机,生成证书

# 这里的时间必须要进行指定。这时证书颁发机构指定的证书的有效期。
# [root@localhost CA]#openssl ca -in /etc/pki/CA/subca.csr -out /etc/pki/CA/certs/subca.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:Serial Number: 1 (0x1)ValidityNot Before: Sep 11 14:38:13 2017 GMTNot After : Sep 11 14:38:14 2018 GMTSubject:countryName               = CNstateOrProvinceName       = shandongorganizationName          = pojun.techorganizationalUnitName    = optcommonName                = subca.pojun.techX509v3 extensions:X509v3 Basic Constraints: CA:FALSENetscape Comment: OpenSSL Generated CertificateX509v3 Subject Key Identifier: DB:3E:9C:F4:F4:E9:42:15:00:E7:35:52:FE:04:9A:48:8C:BD:1A:1BX509v3 Authority Key Identifier: keyid:01:17:F1:CB:91:4B:20:AD:C7:DF:13:05:A4:D8:83:B2:AB:75:D1:05Certificate is to be certified until Sep 11 14:38:14 2018 GMT (3650 days)Sign the certificate? [y/n]:y1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated#此时查看index.txt 文件中,会看到增加了一条新的记录。
[root@localhost CA]#cat index.txt
V	180911143814Z		01	unknown	/C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech

D 将根CA生成的证书颁发给请求者

# 主机B是作为子CA机构存在的,所以证书文件,必须是cacert.pem,否则,子CA将不能够给其他用户颁发证书。
[root@localhost CA]#scp  /etc/pki/CA/certs/subca.crt 172.18.250.114:/etc/pki/CA/cacert.pem

普通用户向子CA机构,申请证书

这一个过程,与子CA向根CA申请证书的过程是类似的。我们将命令的记录如下

#生成私钥文件
# 因为是普通用户,所以生成的私钥文件应该与之前的cacert.pem 有所区别 
[root@localhost ~]# (umask 066; openssl genrsa -out /etc/pki/tls/private/app.key 1024)#利用私钥文件,生成证书申请文件
[root@localhost ~]# openssl req -new -key /etc/pki/tls/private/app.key  -out /etc/pki/tls/app.csr# 将证书申请文件发送给 子CA证书颁发机构
[root@localhost ~]# scp /etc/pki/tls/app.csr  172.18.250.114:/etc/pki/CA# 切换到子CA证书颁发机构
# 子CA证书颁发机构颁发证书
[root@centos6 CA]$openssl ca -in /etc/pki/CA/app.csr -out /etc/pki/CA/certs/app.crt -days 365#将生成的证书传递给申请者
[root@centos6 CA]$scp /etc/pki/CA/certs/app.crt  172.18.253.58:/etc/pki/CA/certs/

这样,正常的证书颁发流程就算是完成了。将我们生成的根证书,子CA证书以及普通用户证书导出到Windows系统中,并安装,然后我们就可以看到,整个证书路径了。如下图所示。

CA证书路径

查看证书状态

查看证书状态,使用下面这条命令 ,可以查看证书的内容以及颁发者的多种信息。

openssl x509 -in /etc/pki/CA/cacert.pem -noout -text|issuer|subject|serial|dates-text   证书的内容
-issuer 证书颁发者的信息
-subject  证书主体的信息
-serial	 证书的序列号信息
-dates 查看证书的时间# 证书颁发者的信息
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -issuer
issuer= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech# 
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -subject
subject= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech# 证书的有效时间
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -dates
notBefore=Sep 11 13:43:42 2017 GMT
notAfter=Sep  6 13:43:42 2037 GMT#也可以根据index.txt 文件中的证书编号,进行查看状态
[root@localhost ~]#openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf01=Valid (V)

吊销证书

这里我们将子CA的证书吊销掉。

A 首先在子CA主机上获取到要吊销的证书的serial

前面的例子中,我们的子CA证书的存放路径是 /etc/pki/CA/certs/subca.crt

[root@centos6 CA]$openssl x509 -in /etc/pki/CA/certs/subca.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech

B 在根CA上根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,然后吊销证书

#进入到CA的路径下,查看文件目录
[root@localhost CA]#pwd
/etc/pki/CA[root@localhost CA]#tree
.
├── cacert.pem
├── certs
│   └── subca.crt		# 这是直接颁发给子CA的证书文件├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│   └── 01.pem			#这个就是与子CA证书一致的Serial文件├── private
│   └── cakey.pem
├── serial
├── serial.old
└── subca.csr# 吊销子CA的证书 使用revoke 命令
[root@localhost CA]#openssl ca -revoke /etc/pki/CA/newcerts/01.pem 
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Revoking Certificate 01.
Data Base Updated

C 指定第一个吊销证书的编号

指定吊销证书的编号,只有在更新证书吊销列表之前,才需要操作

# 这条命令与生成证书时指定证书serial 号码的作用是一致的。
# 就是说,指定下一个证书吊销时的编号。
[root@localhost ~]#echo 01 > /etc/pki/CA/crlnumber
[root@localhost ~]#cat /etc/pki/CA/crlnumber
01

D 更新证书吊销列表

前面指定了证书吊销列表编号之后,就可以来更新证书吊销列表了。

[root@localhost ~]#openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:   #这里提示输入密码

查看证书吊销列表的文件

[root@localhost ~]#openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
Certificate Revocation List (CRL):   #证书吊销列表Version 2 (0x1)Signature Algorithm: sha256WithRSAEncryptionIssuer: /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.techLast Update: Sep 12 11:58:17 2017 GMTNext Update: Oct 12 11:58:17 2017 GMTCRL extensions:X509v3 CRL Number: 1
Revoked Certificates:					#这里的标识显示,证书已经被吊销了Serial Number: 01					#吊销的序列号Revocation Date: Sep 12 11:52:47 2017 GMTSignature Algorithm: sha256WithRSAEncryptionb4:6e:f2:73:21:ed:c4:38:39:06:29:76:61:ac:d6:ee:a4:5d:e8:cb:7c:8b:f8:01:21:ba:bd:b2:46:fa:ea:bf:de:fa:6e:f6:85:d6:93:7c:81:b4:2d:d5:eb:c2:94:a3:6f:13:6d:f3:3f:48:56:85:72:96:cf:e0:ea:a9:0e:07:43:6d:62:2d:4d:e2:2e:b5:02:6a:27:7a:31:76:eb:4e:b1:d6:83:8b:d7:39:10:14:d6:94:77:4b:10:d8:24:46:95:1b:48:87:16:77:ce:8c:1b:54:2c:4d:ee:2f:24:13:10:62:30:32:74:9e:84:49:c9:dc:a9:fc:31:60:57:b5:43:7a:a3:09:75:60:1e:6a:f2:26:e9:54:37:2d:ce:0b:ac:b2:41:c2:d9:02:99:fc:a3:99:15:9c:10:a7:f4:be:08:83:23:ee:ef:74:83:ea:fd:f7:c9:e1:87:6f:9b:1d:c3:df:88:2d:79:2b:71:4b:9e:6f:ae:f9:08:d9:66:d4:f1:49:df:7e:89:99:06:a3:86:72:37:02:78:0f:16:e8:87:8a:61:5b:a3:ac:e2:46:38:ce:86:29:c9:c6:e5:8c:f8:25:2f:7e:d1:62:13:57:a3:a6:10:42:13:b9:e4:0b:fa:9f:f4:d0:95:9b:5d:9b:2d:38:7f:8d:ac:c0:e6:3f

在实际的使用过程中,有很多这样的实例。例如我们经常使用的淘宝,在使用浏览器访问淘宝的时候,就可以查看淘宝的证书吊销列表。如下图所示。

淘宝的证书吊销列表

至此,关于自己搭建CA的过程基本上就完成了。熟悉了上面的操作之后,就可以自己动手简单的搭建一个证书了,然后也可以体验一下整个流程

参考资料

http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

http://kb.cnblogs.com/page/197396/



个人博客地址:http://www.pojun.tech/ 欢迎访问




     本文转自Eumenides_s 51CTO博客,原文链接:http://blog.51cto.com/xiaoshuaigege/1965113,如需转载请自行联系原作者





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最近公共祖先 python_求二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”…

gdb使用实例

第一篇 概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统。Gdb可以调试各种程序,包括C、C、JAVA、PASCAL、FORAN和一些其它的语言。包括GNU所支持的所有微处理器的汇编语言。在gdb的所有可圈可点的特性中,有一点值得注意,…

Linux 监控命令之 netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。 语法 netstat [-acC…

C#递归搜索指定目录下的文件或目录

来源:https://www.cnblogs.com/huhangfei/p/5012978.html诚然可以使用现成的Directory类下的GetFiles、GetDirectories、GetFileSystemEntries这几个方法实现同样的功能,但请相信我不是蛋疼,原因是这几个方法在遇上【System Volume Informati…

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录,可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年,高中毕业的我问一个已经工作两年的亲戚:什么专业工资高?他告诉我:程序员。2008年成都最低工资好像是800元,我的生活费也是800元,据他所说程序员出来的工资是2000,于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言:a100 a变量里面放的100 b a b变量里面也放的100 python : a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存,贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

Linux 状态命令之磁盘状态 iostat

Linux系统中的iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就…

GDB十分钟教程

GDB十分钟教程 作者: liigo 原文链接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友,以及程序爱好者。 GDB是一个由GNU开源组织发布的、UNIX/LI…

课后作业-阅读任务-阅读提问-3

1.如果两个人合作的始终达不到规范阶段该怎如何处理? 2. 逻辑和界面设计要注意哪些因素?转载于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了,原谅最近作者几天事情不断。按照我们之前的计划,需要迅速开启很重要的核心多用例接口。首先,我们要确定,这个功能的大体设计。就放在在我们的页面 用例库 中:所以也就是我们很久之前就创建好的P_cases.…

黑客攻防专题八:21种RING的提权方法

好多都没有成功,还是发来看看,看看思路,呵呵 以下全部是本人提权时候的总结 很多方法至今没有机会试验也没有成功,但是我是的确看见别人成功过的。本人不才,除了第一种方法自己研究的,其他的都是别人的经验…

Linux 状态命令之内存状态 free

简介 free指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#xff0c;共享内存区段&#xff0c;以及系统核心使用的缓冲区等。 语法 free [-bkmotV][-s <间隔秒数>]参数说明&#xff1a;-b  以Byte为单位显示内存使用情况。-k  以…

SpringMVC在使用Jackson2时关于日期类型格式化的问题

*本例程序使用Jackson2.9.0&#xff0c;jackson1.x的处理方式稍稍有些不同。 在基于Spring&SpringMVC的Web项目中&#xff0c;我们常使用Jackson(1.x/2.x)来增加程序对Json格式的数据的支持。 因此&#xff0c;在实际应用中有个常见的需求&#xff1a;日期的格式化。 假设&…

GDB 使用——Linux C编程

简述 一 列文件清单 二&#xff1a;执行程序 三&#xff1a;显示数据 四&#xff1a;断点(breakpoint) 五&#xff0e;断点的管理 六&#xff0e;变量的检查和赋值 七. 单步执行 八&#xff0e;函数的调用 九&#xff0e;机器语言工具 …

python拨号_python 拨号代码(win10 系统亲测有效)

# -*- coding: utf-8 -*-import win32rasimport time,osdef Connect(dialname, account, passwd):dial_params (dialname, , , account, passwd, )return win32ras.Dial(None, None, dial_params, None)def DialBroadband():dialname u宽带连接 #just a nameaccount u059291…

HP服务器引导盘下载地址

HP SmartStart CD 8.7 x32版本的下载地址为&#xff1a;http://ftp.hp.com/pub/softlib2/software1/cd/p1040463476/v63549/smartstart-8.70-0-x86.zip HP SmartStart CD 8.7 x32版本支持以下机型&#xff1a; HP ProLiant ML 和 DL 300、500 和 700 系列以及 HP ProLiant BL S…

MUI - 预加载

打开详情页回到顶部:document.body.scrollTop document.documentElement.scrollTop 0;方式一&#xff1a;preload一次仅能预加载一个页面&#xff08;除非循环&#xff09; var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …

python 分类变量xgboost_【转】XGBoost参数调优完全指南(附Python代码)

xgboost入门非常经典的材料&#xff0c;虽然读起来比较吃力&#xff0c;但是会有很大的帮助&#xff1a;英文原文链接:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/