The Certificate Chains

概念解释:

标识名 (Distinguished Name, DN)

签名(Signing)

"三级证书"是指用户的SSL证书是在"受信任的根证书颁发机构"下的"中级证书颁发机构"下颁发的证书

"二级证书"只指用户的SSL证书是直接在 "受信任的根证书颁发机构"下颁发的证书。

请注意,这里的级别是指证书路径的级数(Level),要与证书的身份验证等级(Class)区分开 来,Class 3证书的身份认证过程要比Class 2证书的身份认证过程严格。

在实际使用中,为了提高网站的安全性,我们提供了https的访问的方式,https访问需要证书。

首先我上一个我们sso所使用的数字证书的图。

cer-chain

这是一个三级证书,我们将自己生成的CSR提交给签名商,他们用中级证书机构的私钥Private Key给我们的签名成证书。而他们的的证书又是通过Root CA颁发的(即Root CA通过它的私钥对中级机构提交的CSR进行了签名)。
签名的原理如下图。

800px-digital_signature_diagramsvg

下面是证书有效性验证的图。这就是证书链的概念所在。

sy10600a

Posted in 互联网 | Tagged | Leave a comment

Public-key cryptography

[!TOC]

互联网的诞生之初就有信息安全问题的存在。

在信息技术高度发展的今天,信息安全更为重要,从对称加密,再到非对称加密,人们一直在为网络的安全做出斗争。

今天我这里谈的 主要是非对称加密。在传统的对称加密的情况下,密码很容易被泄露,这样信息的安全性就得不到保证。

但非对称加密的出现使得人们看到了希望。

在非对称加密中,有一对密钥,公钥和私钥。用公钥加密的信息只有用私钥才能解密,用私钥加密的信息只有用公钥才能解密。

其中公钥是公开出去的,可以给任何人。私钥是保密的只能自己知道。

所以我们可以通过非对称加密做一些对称加密无法做到的事情,

假设我们用公钥加密的过程为PubKeyEncrypt() 公钥解密为 PubKeyDecrypt()

私钥加密的过程为 PriKeyEncrypt()私钥解密的过程为PriKeyDecrypt()

1.身份认证

比如A和B进行交互,A发消息给B,B要怎么样才能判断接受的消息确实来自A呢? 可以这样

PriKeyEncrypt("hello", A's Private Key)然后发给B,然后B通过A的公钥来解密,如果正确的解密PubKeyDecrypt(msg,A's Public Key)得到hello,就说明信息确实来自A

250px-public_key_signingsvg

但是这个时候问题出来了,B如何得到A的公钥呢?除非A和B认识,且A当面通过U盘或者别的方式把A的公钥交给B,然后B拿回去使用(在网络化的今天这很不现实),要不然在网络上直接传输的很有可能被拦截,然后被替换掉,那怎么办呢?

这个时候涉及一个公钥的发布的问题,目前的那些CA机构(Certificate Authority)所做的事情便是这个事(我心里老在想,CA机构给别人弄弄认证和证书一年就可以弄那么多钱,但是他的私钥的保密性的重要性,不言而喻啊)。

A将自己的公钥(通常是一个CSR--Certificate Signing Request文件,CSR文件包含了你的公钥,以及你的组织和域名的信息)和相关的营业证书或者能够证明法人身份的证件传真发给CA机构,CA机构(第三方的大家都可以信任的)会对A的身份进行全面的认证,确保A就是真正的A(这个时候需要A提供能够证明其身份的证明),同时明确各自在法律上的责任。如果认证成功之后,CA机构使用自己的私钥将A提交的公钥以及相关信息的哈希值进行加密,也叫签名。PriKeyEncrypt(Hash value,CA's Private Key) 这个时候得到的便是一个数字证书了。用户使用大家都信任的CA机构的Public Key将证书的签名解密可以得到相应的数字证书的哈希值然后比较看是否正确。

比如B得到A的证书(这个证书别人是无法伪造的,除非得到CA机构的私钥),B通过CA机构的公钥将这个证书解密,得到A的公钥,然后再来使用,这个时候就没有问题了。

2.数据的保密性和完整性

也许很多人看到数据的保密性会直接想到,通过非对称的方式对传输的数据进行加密不就可以保证了数据的保密性了么?

但是有一个成本的问题,非对称加密解密的成本比对称加密大的多,

这个时候我们需要对称加密和非对称加密相结合使用了。

比如B和A进行交互,B通过A的公钥将一个密码加密后传给A并协商好下面传输的信息都通过这个密码进行加密。

由于只有A的私钥才能解开这个将要使用的密码,所以密码的传输时绝对安全的。

数据的保密性得到保障之后,我们怎么才能保障数据在传输过程中,没有被恶意删减或修改呢,这个时候我们就需要保障数据的完整性。

保障数据的完整性,我们通常的做法就是通过哈希函数对需要传输的数据进行哈希求值(哈希值也称为输入数据的数字指纹Digital Fingerprint或消息摘要Message Digest等),一般情况下我们可以使用MD5或者SHA-1,一般情况下认为,只要原文有一点变化,哈希值就会变化。

算出的哈希值附在消息上一起发送给对方B,为了确保A在发给B的过程中,为了防止哈希值和原文同时被恶意修改,我们可以通过使用A的私钥对哈希值进行一次加密,这样只有得到A的私钥才能正确的修改这个哈希值。

3.不可否认性

这个比较好理解,比如A和B,A经过CA认证了,如果A通过自己的私钥加密发送消息给了B

那么A就无法否认了,因为只有使用A的私钥加密的信息才能被A的公钥进行解密。

Posted in 互联网 | Tagged , , | Leave a comment

JDBC Test With Oracle

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class OracleTest {
public static void main(String[] args) {
try {
String user = "user";
String password = "pass";
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc: oracle:thin:@192.168.11.11:1521:dbname";
String sql = "SELECT sysdate FROM dual";
Class.forName(driver).newInstance();
Connection c = DriverManager.getConnection(url, user, password);
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(1) + user + password);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

Posted in 编程 | Tagged , , , | Leave a comment

Spring Mail Sample

依赖的库:

spring-2.5.4.jar
mail-1.4.jar
log4j-1.2.12.jar
commons-logging-1.0.4.jar
activation-1.1.jar

源代码:

package mail;

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

public class MailSender {

public static void main(String[] args) throws Exception {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
// 设定 Mail Server
senderImpl.setHost("172.16.60.72");

// 建立邮件讯息
SimpleMailMessage mailMessage = new SimpleMailMessage();

// 设定收件人、寄件人、主题与内文
mailMessage.setTo("kejin.lukj@alibaba-inc.com");
mailMessage.setFrom("kejinlu@gmail.com");
mailMessage.setSubject("Test");
mailMessage.setText("This is a test!!!");

// 传送邮件
senderImpl.send(mailMessage);

System.out.println("Mail Sended!");
}

}

Posted in 编程 | Tagged , , | Leave a comment

Apply for digital certificates

昨晚终于将SSO的2010年的数字证书替换上去了。

现在我们的很多系统的证书都是自己制作的,访问的时候浏览器会发出警告,只要用户确认浏览后是可以正常使用系统的。

但是SSO系统有点特殊的,所有使用sso的系统都需要在java代码层和sso进行https的交互,所以如果不使用正规的CA证书的话,就会需要在别的系统的keystore中导入我们的证书,会很麻烦的,所以sso就一直在使用VeriSign的数字证书,每年大概7-8k

下面主要讲解下申请数字证书的过程吧。

1.对公司信息进行认证核实

我们是向"北京天威诚信电子商务服务有限公司"购买的,
首先需要填写几张申请的表格,
还需要给他们传真本公司的最新年检过的营业执照。
如果使用者的公司名称和域名所有者的名称不一致的话,还需要域名的所有者进行回复邮件(还写了一封英文的邮件给那个人,可惜他没有收到VeriSign发的确认信)。
所以后来采取第二套方案,就是域名使用授权信,需要本公司另一名证书员工的签字,来担保。
2.给对方发送csr文件

首先你需要正确的安装好JDK

然后通过如下的命令生成一个RSA的密钥对

keytool -genkey -alias tom_server -keyalg RSA -keysize 1024
-keystore keystore.jks

-genkey[产生密钥对]
-alias[密钥对别名]
-keyalg[密钥算法参数]
-keysize[密钥位数]
-keystore[密钥存储文件路径]
[注]:-alias 后的 tom_server 是密钥对的名字,可替换为自己需要的名字;

这个时候需要你输入密码和一些信息(全英文数字填写)
其中包括
CN通用名 填写你所申请的域名(不需要带https之类的)
组织:公司全称
组织单元:部门名称
城市
省份
国家代号:CN

这样之后就会产生一个keystore.jks的文件,文件中保存了一个RSA的密钥对

生成 CSR
输入 keytool -certreq -alias tom_server -sigalg MD5withRSA -file
server.csr -keypass password -keystore keystore.jks -storepass
password

-certreq[产生待签名证书]
-alias[证书别名]
-sigalg[证书算法参数]
-file[产生文件输出路径]
-keypass[密钥保护密码]
-keystore[存储文件路径]
-storepass[存储密码]

keypass和storepass最好一样都为你刚刚生成密钥对时设置的密码。

好了这个时候你把csr文件发送给对方。

3.收到证书已经更新证书

对方会邮件的方式将证书内容发你,如果直接是文本 你需要将文本拷贝到记事本中保存成cer文件。

这个时候我们需要导入两个证书,一个是他们给我们发的证书,

另一个是他们自己公司的证书

导入服务器证书
输入:keytool -import -v -trustcacerts -storepass password -alias
tom_server -file server.cer -keystore keystore.jks

[注] 此时的"password"为生成证书时输入密码,-alias 为服务器证书的别名

导入中级 CA 根证书

输入:keytool -import -v -trustcacerts -storepass password
-alias my-ca-root -file intermediate.cer -keystore keystore.jks

-import[导入命令]
-v -trustcacerts[导入信任证书]
-storepass[存储密码]
-alias[证书别名]
-file[证书文件路径]
-keystore[导入文件路径]

Posted in 软件 | Tagged , , , | Leave a comment

How to export your private key from keystore

[code=java]
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;

import sun.misc.*;

public class ExportPrivateKey {
private File keystoreFile;
private String keyStoreType;
private char[] password;
private String alias;
private File exportedFile;

public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
try {
Key key=keystore.getKey(alias,password);
if(key instanceof PrivateKey) {
Certificate cert=keystore.getCertificate(alias);
PublicKey publicKey=cert.getPublicKey();
return new KeyPair(publicKey,(PrivateKey)key);
}
} catch (UnrecoverableKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (KeyStoreException e) {
}
return null;
}

public void export() throws Exception{
KeyStore keystore=KeyStore.getInstance(keyStoreType);
BASE64Encoder encoder=new BASE64Encoder();
keystore.load(new FileInputStream(keystoreFile),password);
KeyPair keyPair=getPrivateKey(keystore,alias,password);
PrivateKey privateKey=keyPair.getPrivate();
String encoded=encoder.encode(privateKey.getEncoded());
FileWriter fw=new FileWriter(exportedFile);
fw.write("—–BEGIN PRIVATE KEY—–\n");
fw.write(encoded);
fw.write("\n");
fw.write("—–END PRIVATE KEY—–");
fw.close();
}

public static void main(String args[]) throws Exception{
ExportPrivateKey export=new ExportPrivateKey();
export.keystoreFile=new File("/Users/Luke/Workspace/StringTest/src/com/lukejin/stringtest/keystore.jks");
export.keyStoreType="JKS";
export.password="changeit".toCharArray();
export.alias="tom_server";
export.exportedFile=new File("luke");
export.export();
}
}
[/code]

在eclipse中使用 import sun.misc.*;这个会报错的,可以先将这个的jar包移除,然后再添加下。就可以了

Posted in 编程 | Leave a comment

Three Words Of Google Wave:WebApp Platform Protocol

尽管很多人用完Wave尝尝新鲜,且觉得其不知所以然,然后就“束之高阁”。这个情理之中。
今日无聊就这三个词扩展下。

1.产品

一开始Google将Google Wave作为像Gmail,Google Docs 这样的Google Web App供大家使用,人们在Google 自己的Google Wave上进行各种协同活动

2.平台

Google Wave提供了各种API 方便对Wave本身的功能进行扩展
Google很知道程序员社区对于软件发展的重要性,所以从一开始Google Wave就是Open Source的,开放出大量的API和完善的开发文档让广大的编程人员参与其中,为之编写出各种各样的插件,给Wave增加各种Magic的功能

扩展主要分两类:
Robots
机器人,使用的时候是你可以将机器人添加到某一个Wave中,机器人会将当前Wave中的的特殊的字符替换城一定的内容(机器人的本质是翻译,把一个内容翻译成另外的一种内容)
Gadgets
看到这个你也许会立马想到Google Gadgets
Gadget顾名思义就是小玩意儿,小东西
在Web应用的世界里我们可以将其理解成 Mini Web Application
那个Google Wave Gadgets 有什么不同的地方呢,
那当然是协同
在Wave的世界里,服务器会记录Gadget的状态(State),而又因为Google wave可以记录Wave变化的整个过程,所以Wave里的Gadget可以被回放的(比如那个国际象棋的Gadget)

这里再讲解一个东西
Extension Installer
为了方便对gadgets扩展的使用,我们可以做一个Extension Installer ,这样安装了之后会在你的Wave的编辑篮的上方出现相应的按钮图标,这个的主要功能主要是方便Gadget的插入

Embed Wave
这类Wave API可以使得我们方便的将某个wave的内容或者一些功能集成到别的网站上。
就好像在别的网页程序里嵌入一个Wave。

3.协议

一开始Google就发布这个关于Google Wave协议的网站 http://www.waveprotocol.org/
之前和某个大学同学还争论Google Wave和Google Chrome OS的关系,
说实话,这两个东西并没有直接关系,现在的Wave只是基于HTML5的一个Web应用

Google Wave的终极目标可能是成为网络交互的一种协议。就像XMPP(前身是Jabber)协议一样,
各个企业都可以部署自己的Google Wave服务器,自己的员工可以在自己的服务器上使用Google Wave,同时你也可以使用网络上各种Wave的扩展。
当然要是你有能力,你完全可以根据其协议写一套自己的东西(比如完全基于桌面的)What ever

Posted in 互联网 | Tagged , | Leave a comment

深度剖析Java的字符编码

[!TOC]

Java中的String在JVM运行时都是Unicode编码的。切记!!!

字符集

--------------------------------------------------
在计算机的世界里,我们需要表示太多太多的字符,为了计算机能够正确的显示这些字符,我们将这些字符编码,使得字符和一系列的代号一一对应。当我们的系统按照一种编码方式去读取一个文件的时候,会自动的将里面的编码转换成相应的字符显示在屏幕上。(我们这里并不讨论如何将字符在显示器上通过点阵的方式显示的这个过程)
中文由于其字符数多,其编码方式自然比西方的字符复杂。所以在编写代码,软件使用的过程中,我们经常碰到中文乱码的相关问题。
首先我们看一个比较常见的浏览器乱码的例子,
Continue reading

Posted in 编程, 软件 | Tagged , | Leave a comment

Eclipse Workset

当Eclipse中的项目很多的时候,我们需要建立工作集将项目分类,以便管理。

2009-11-19-14-06-44

Posted in 未分类 | Leave a comment

How to open a link with a new tab in safari

使用下面的命令后重启Safari:

defaults write com.apple.Safari TargetedClicksCreateTabs -bool true

如果想取消这个功能,使用下面的命令,重启Safari:

defaults write com.apple.Safari TargetedClicksCreateTabs -bool false

注:使用的是Snow Leopard + Safari4

Posted in 软件 | Tagged | Leave a comment