本文记叙的是一次基于SSL的socket通讯程序开发中,有关证书,签名,身份验证相关的步骤。 我们的场景下,socket服务端是java语言编写的,客户端是c语言。使用了一个叫做matrixssl的c语言库。自己做CA签名,不等同于“自签名”。 自签名的情况,RSA的公钥私钥只有一对,用私钥对公钥证书做签名。而我们的场景是,自己做CA,有一个CA的公钥私钥对。 而socket的服务端也有一个公钥私钥对。 用CA的私钥对socket服务端的公钥证书做签名。
openssl genrsa -out ca.key 1024
(这里我们没有用des3加密。 可以增加一个-des3参数加密,详情可以man genrsa)
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt
(这一步的时候需要在提示之下输入许多信息,包括国家代码,省份,城市,公司机构名等)
生成server端的私钥key:
openssl genrsa -out server.key 1024
生成server端的req文件(这一步生成的req文件,包缓腊含公钥证书,外加身份信息,例如国家,省份,公司等。用它提交给ca,让ca来对它做签名 ):
openssl req -new -key server.key -out server.csr
用CA的私钥对server的req文件做签名,得到server的证书:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
(注:如果第一次使用openssl,报告一些相关的文件找不到之类的错误,可能需要先执行2个命令:touch /etc/pki/CA/index.txt 和 echo '01' >/etc/pki/CA/serial)
以上得到的server.crt就是服务端的证书文件。(有很多软件中需要各种不同证书存储格式,可能需要各种转换。 如此尘PEM, P12等,我们的场景下也需要一点转换,下文会描述。刚开始做这些的同学可能会觉得证书,以及格式等非常的混乱。 这个时候能做的就是冷静下来,耐心的理清楚TLS, RSA等原理, 多看看openssl的man文档)
不知道把ca.crt叫做CA的证书文件是否妥当,但是可以确定的是,客户端使用ca.crt可以校验server的身份。server在SSL/TLS握手的过程中会下发自己的证书,而这个证书是经过CA签名的。CA签名的时候使用的是CA自己的私钥,而ca.crt则包含了CA的公钥,可以用于检验这一签名,以确认是否是自己签的名。
服务端需要使用的文件是:server私钥(key), server证书。
客户端需要使用的文件是:CA file(ca的证书,用以验证server下发的证书)
我们的server端使用java, 使用p12(PKCS12)格式的证书。使用openssl可以进行格式转换:
openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12
可以看到输出的server.p12中应该包含了server.key和server.crt的内容。
我们的c语言客户端直接使用CA文件: ca.crt.
我们也用java写过客户端, java使用CA文件格式为 jks。那么可能需要一个转换,这里使用的是java的bin目录下的keytool:
keytool -importcert -alias CA -file ca.crt -keystore ca.jks
转换的时候要求输入一个密码。这样就把ca.crt转换为了 ca.jks格式。
下面附上部分socket服务端和java版的客户端的代码。c的就不贴了,用的matrixssl。
java服务端(mina)代码片段:
String file = "/file/path/server.p12"
String keyType = "PKCS12"char[] password = "passwd".toCharArray()
KeyStore ks = KeyStore.getInstance(keyType)
ks.load(new FileInputStream(file), password)
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm())
kmf.init(ks, password)
SSLContext ctx = SSLContext.getInstance("TLS")
ctx.init(kmf.getKeyManagers(), null, null)
SslFilter sslFilter = new SslFilter(ctx)在mina的aeptor中增加这个filter就可以了。
aeptor.getFilterChain().addLast("ssl", new SslFilter(createSslContext()))
java版客户端(mina)代码片段: trust String file = "/data/tmp/ca.jks"
String keyType = "jks"char[] password = "123456".toCharArray()
KeyStore ks = KeyStore.getInstance(keyType)
ks.load(new FileInputStream(file), password)
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm())
tmf.init(ks)
SSLContext sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, tmf.getTrustManagers(), null)
SslFilter sslFilter = new SslFilter(sslContext)
sslFilter.setUseClientMode(true)server端是addLast , 这个却是 addFirst. 这个顺序不能搞错了。
connector.getFilterChain().addFirst("sslFilter", sslFilter)
自己生成的ssl证书与购买的ssl证书有什么区别1、自己生成的ssl证书是没有通过认证的,非法的SSL证书,购买的SSL证书是有CA机构如沃通WoSign CA签发的SSL证书,CA机构要经过国际webtrust认证和电子签发法许可。
2、自己生成的SSL证书,浏览器不信任,会阻止访问;购买的SSL证书浏览器信任,显示绿色安全锁;
3、自己生成的SSL证书容易被伪造和假冒,容易被中间人攻击,不安全。购买的SSL证书更加安全可信。
举个例子:
自己生成的SSL证书,就像自己制作的身份z,没人认可,没有机构认可,无法通行。
购买的SSL证书,就像公安局颁发的身份z,全球认可,购物,刷卡,住宿都顺利通行。如果你违反乱纪,公安局就可以查到你的身份z进行吊销或者标记追踪。
如何打开pdf文件http://www.wenjianw.cn/
PDF全称Portable Document Format,是Adobe公司开发的电子文件格式。这种文件格式与 *** 作系统平台无关,也就是说,PDF文件不管是在Windows,Unix还是在苹果公司的Mac OS *** 作系统中都是通用的。这一特点使它成为在Internet上进行电子文档发行和数字化信息传播的理想文档格式。越来越多的电子图书、产品说明、公司文告、网络资料、电子邮件开始使用PDF格式文件。PDF格式文件目前已成为数字化信息事实上的一个工业标准。
Adobe公司设计PDF文件格式的目的是为了支持跨平台上败告饥的,多媒体集成的信息出版和发布,尤其是提供对网络信息发布的支持。为了达到此目的, PDF具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集察返成度和安全可靠性都较高。
PDF文件使用了工业标准的压缩算法,通常比PostScript文件小,易于传输与储存。它还是页独立的,一个PDF文件包含一个或多个“页”,可以单独处理各页,特别适合多处理器系统的工作。此外,一个PDF文件还包含文件中所使用的PDF格式版本,以及文件友清中一些重要结构的定位信息。正是由于 PDF文件的种种优点,它逐渐成为出版业中的新宠。
对普通读者而言,用PDF制作的电子书具有纸版书的质感和阅读效果,可以“逼真地”展现原书的原貌,而显示大小可任意调节,给读者提供了个性化的阅读方式。由于PDF文件可以不依赖 *** 作系统的语言和字体及显示设备,阅读起来很方便。这些优点使读者能很快适应电子阅读与网上阅读,无疑有利于计算机与网络在日常生活中的普及。Adobe公司以PDF文件技术为核心,提供了一整套电子和网络出版解决方案,其中包括用于生成和阅读PDF文件的商业软件Acrobat和用于编辑制作PDF文件的Illustrator等。 Adobe还提供了用于阅读和打印亚洲文字,即中日韩文字所需的字型包。
PDF的阅读
用Adobe公司的Arcobat Reader 7.0软件(该软件免费)即可阅读PDF文件。 更多信息请访问 Adobe 站点。www.adobe.com。
还有现在很多厂家的产品也能够浏览pdf,比如windows平台下的Apabi Reader,linux平台下的kpdf等等
如何打开pdf文件
http://zhidao.baidu.com/question/25449262.html
参考资料:http://www.wenjianw.cn/
可能原因是闭神你使用的浏览器或下载工具自动进行了文件昌启名更改。有些浏览器和下载工具会使用默认的命名规则,而不考虑文件名是否已经耐态如存在,可能会重复重命名文件。另一种可能原因是服务器响应头没有正确地设置文件名。在Element中,如果服务器没有正确地设置Content-Disposition响应头,浏览器就无法正确地确定文件名,因此浏览器也可能会对文件名进行更改。
要解决这个问题,你可以尝试以下方法:
1. 更改浏览器或下载工具的设置,让它们不会自动更改文件名。
2. 在代码中正确设置Content-Disposition响应头,例如:`Content-Disposition: attachmentfilename="yourfilename.req"`。
3. 将文件下载到指定的路径下,避免多次下载导致的文件名重写问题。
希望以上方法能够解决你的问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)