获取上一次执行结果:
Linux:
echo $?
Win:
echo %ERRORLEVEL%
Learn and share.
获取上一次执行结果:
Linux:
echo $?
Win:
echo %ERRORLEVEL%
设计模式
1、设计模式原则
开放封闭原则:一个类,对修改封闭,对扩展开放
依赖反转原则:依赖于抽象而不是具体实现,实现依赖接口,接口不依赖于实现
迪米特法则:尽量减少与其他类的关系,降低类之间耦合度
里氏转换原则:子类必须能替代父类
接口隔离原则:类的依赖建立在最小接口之上,多个小接口优于一个大接口
合成复用原则:聚合优先于继承
2、简单工厂
将创建实例的代码,集中到一个类中,实现一个类创建多种实例。
3、工厂模式
将创建实例的代码,在工厂子类中实现,调用者负责使用哪个工厂。
4、抽象工厂
将工厂抽象为一系列的接口,在每个工厂子类中,用工厂方法实现这些接口。
5、模板方法
创建对象的步骤固定,每个步骤都放到子类中实现。
6、生成器
创建对象的步骤不固定,但组件固定,可以方便的增加各种组件。
7、策略模式
多种算法,在使用时,指定选用的算法。
8、状态模式
多种算法,根据对象的状态,选用对应的算法。
9、装饰者
包装现有对象,增加功能。
10、外观
将一系列复杂接口,重新组成一个简单的接口。
11、迭代器
不暴露细节的前提下,提供遍历
Java、DotNet
12、组合
对象和组,采用相同的方式来实现
菜单
13、代理
提供代理类,间接访问对象,提供访问控制,调用者不知道被代理类的存在
远程代理,虚拟代理
14、桥接
采用桥接类,利用组合访问的方式,处理桥接对象之间的访问
15、适配器
封装原有接口,成为新接口
16、观察者
对象状态改变,通知其他对象
17、访问者
不改变原来实现的前提下,通过访问者,提供新功能(破坏封装)
18、中介者
多个对象之间的访问,改变为对象与中介者之间的访问
19、命令
将请求封装为对象,可以回滚
20、备忘录
记录状态,随时回滚
21、单件
最多只有一个实例
22、蝇量(享元)
同一类的大量实例,共享存储
23、原型
复制复杂对象,而并非重新创建对象
24、解释器
嵌入式语言
25、责任链
消息响应链
26、组合模式
MVC等
好书推荐:
《Head First设计模式》、《大话设计模式》、《23种设计模式》
ADT:
https://dl-ssl.google.com/android/eclipse/
DLTK:
http://download.eclipse.org/technology/dltk/updates/
PyDev:
http://pydev.org/updates
EPIC:
http://e-p-i-c.sf.net/updates
PDT:
http://download.eclipse.org/tools/pdt/updates/2.0
http://download.eclipse.org/tools/pdt/updates/3.0/milestones/
指定JDK
eclipse.exe -vm D:\JavaJDK\jdk1.7.0_06\bin\javaw.exe
1、生成自签名的CA私钥及自签名证书,并导出为der、p12、jks格式
set OPENSSL_CONF=C:\ProgramerTools\OpenSSL-Win64\bin\openssl.cfg #生成私钥 openssl genrsa 1024 > NMyCA1024.key #生成自签名证书 openssl req -new -x509 -nodes -key NMyCA1024.key -days 1095 -subj "/C=CN/ST=ShangHai/L=ShangHai/O=NEOHOPE/OU=Development/CN=NMyCA1024" > NMyCA1024.pem #转der格式,生成trust store openssl x509 -outform der -in NMyCA1024.pem -out NMyCA1024.crt keytool -import -trustcacerts -file NMyCA1024.crt -keystore NMyCA1024_trust.jks -storepass 123456 #转p12格式,生成key sotre openssl pkcs12 -export -out NMyCA1024.p12 -in NMyCA1024.pem -inkey NMyCA1024.key keytool -importkeystore -srckeystore NMyCA1024.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore NMyCA1024_key.jks
2、生成网站私钥,并生成CA签名的证书,并导出为der、p12、jks格式
#生成私钥 openssl genrsa 1024 > server.key #从CA请求证书 openssl req -new -key server.key -subj "/C=CN/ST=ShangHai/L=ShangHai/O=NEOHOPE/OU=Development/CN=127.0.0.1" > server.csr #生成CA签名的证书 openssl x509 -req -in server.csr -CA NMyCA1024.pem -CAkey NMyCA1024.key -CAcreateserial -days 365 > serversigned.crt #生成trust store keytool -import -trustcacerts -file serversigned.crt -keystore serversigned_trust.jks -storepass 123456 #转p12格式,生成key sotre openssl pkcs12 -export -out serversigned.p12 -in serversigned.crt -inkey server.key keytool -importkeystore -srckeystore serversigned.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore serversigned_key.jks
3、在server端使用serversigned.p12或serversigned_key.jks
4、在浏览器端,导入NMyCA1024.crt为CA根证书,浏览器就可以正常打开HTTPS网站了
5、如果是要用Java Client端进行认证,则需要将CA证书导入到对应JDK或JRE的CA列表中,用serversigned_trust.jks就可以正常访问了
keytool -import -trustcacerts -file NMyCA1024.crt -alias NMyCA1024 -keystore %JRE_HOME%\lib\security\cacerts -storepass changeit
1、获取网站证书信息
set OPENSSL_CONF=C:\ProgramerTools\OpenSSL-Win64\bin\openssl.cfg #获取淘宝证书信息 openssl s_client -showcerts -connect www.taobao.com:443 #获取淘宝ssl2证书信息 openssl s_client -showcerts -ssl2 -connect www.taobao.com:443
2、验证证书链
比如,我有一个自签名的三层证书系统:
NMyCA1024(RootCA,自签名认证)
NMySubCA1024(NMySubCA1024是是中级CA,是NMyCA1024认证过的)
Server(Server是服务器证书,是NMySubCA1024认证过的)
可以用如下方法验证证书链:
#会告诉你这是一个自签名证书 openssl verify NMyCA1024.pem #L1中方的是NMyCA1024的证书 openssl verify -CAfile L1.pem NMySubCA1024.pem #L2中方的是NMyCA1024及NMySubCA1024的证书 openssl verify -CAfile L2.pem Server.pem #只用中级证书,会导致证书链不完整,无法通过验证 openssl verify -CAfile NMySubCA1024.pem Server.pem
下面的程序用来验证JKS的文件及密码是否正确
public static URL getStoreURL(String storePath) throws IOException
{
URL url = null;
// First see if this is a URL
try
{
url = new URL(storePath);
}
catch (MalformedURLException e)
{
// Not a URL or a protocol without a handler so...
// next try to locate this as file path
File tst = new File(storePath);
if (tst.exists() == true)
{
url = tst.toURL();
} else
{
// not a file either, lastly try to locate this as a classpath
// resource
if (url == null)
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
url = loader.getResource(storePath);
}
}
}
// Fail if no valid key store was located
if (url == null)
{
String msg = "Failed to find url=" + storePath + " as a URL, file or resource";
throw new MalformedURLException(msg);
}
return url;
}
public static KeyStore loadKeyStore(String storeType, URL storePathURL, String storePassword) throws Exception
{
KeyStore keyStore = null;
String provider = null;
String providerName = null;
if (provider != null)
{
keyStore = KeyStore.getInstance(storeType, provider);
} else
if (providerName != null)
{
keyStore = KeyStore.getInstance(storeType, providerName);
} else
{
keyStore = KeyStore.getInstance(storeType);
}
if (storePathURL == null) { throw new Exception("Can not find store file for url because store url is null."); }
// now that keystore instance created, need to load data from file
InputStream keyStoreInputStream = null;
try
{
keyStoreInputStream = storePathURL.openStream();
// is ok for password to be null, as will just be used to check
// integrity of store
char[] password = storePassword != null ? storePassword.toCharArray() : null;
keyStore.load(keyStoreInputStream, password);
}
finally
{
if (keyStoreInputStream != null)
{
try
{
keyStoreInputStream.close();
}
catch (IOException e)
{
// no op
}
keyStoreInputStream = null;
}
}
return keyStore;
}
public static String verifyP12(String p12Path,String p12Pwd)
{
String ret = "验证成功";
try
{
URL ksURL = getStoreURL(p12Path);
if(ksURL==null)throw new Exception(p12Path+"文件未找到");
loadKeyStore("PKCS12",ksURL,p12Pwd);
}
catch(Exception ex)
{
ret = ex.getMessage();
ex.printStackTrace();
}
return ret;
}
public static String verifyJks(String jksPath,String jksPwd)
{
String ret = "验证成功";
try
{
URL ksURL = getStoreURL(jksPath);
loadKeyStore("JKS",ksURL,jksPwd);
if(ksURL==null)throw new Exception(jksPath+"文件未找到");
}
catch(Exception ex)
{
ret = ex.getMessage();
ex.printStackTrace();
}
return ret;
}
只要设置下面几个环境变量就好啦;)
public static final String TRUST_STORE_PASSWORD = "javax.net.ssl.trustStorePassword"; public static final String TRUST_STORE = "javax.net.ssl.trustStore"; public static final String TRUST_STORE_TYPE = "javax.net.ssl.trustStoreType"; public static final String KEY_STORE_TYPE = "javax.net.ssl.keyStoreType"; public static final String KEY_STORE_PASSWORD = "javax.net.ssl.keyStorePassword"; public static final String KEY_STORE = "javax.net.ssl.keyStore";
生成私钥及自签名证书(自签名这样就可以咯)
set OPENSSL_CONF=%OPENSSL_HOME%\bin\openssl.cfg openssl genrsa 1024 > test.key openssl req -new -x509 -nodes -key test.key -days 1095 -subj "/C=CN/ST=ShangHai/L=ShangHai/O=NEOHOPE/OU=Development/CN=NMyCA1024" > test.pem
生成私钥、证书请求及自签名证书(通常是把csr文件发给第三方机构申请证书,这里仍然是自签名)
set OPENSSL_CONF=%OPENSSL_HOME%\bin\openssl.cfg openssl genrsa -out test1.key 1024 openssl req -new -key test.key -out test1.csr -subj -subj "/C=CN/ST=ShangHai/L=ShangHai/O=NEOHOPE/OU=Development/CN=NMyCA1024" openssl x509 -req -days 3650 -in test1.csr -signkey test1.key -out test1.pem
这里请注意,自签名证书的话,上面两种方式是一样的。但这里只有一层,也就是没有CA的存在,如果需要CA及服务器两层的话,就要:
1、生成CA的私钥及证书
2、生成服务器私钥及证书
3、用CA的私钥对服务器证书签名
4、所有客户端信任CA证书
pem转为p12(私钥+证书)
set OPENSSL_CONF=%OPENSSL_HOME%\bin\openssl.cfg openssl pkcs12 -export -out test.p12 -in test.pem -inkey test.key
pem转为jks的truststore(ca证书)
keytool -import -v -trustcacerts -file test.pem -keystore test.jks -storepass 123456 -alias caRoot keytool -list -v -keystore test.jks -storepass 123456
p12转为jks的keystore(私钥+证书)
keytool -importkeystore -srckeystore test.p12 -destkeystore test1.jks -srcstoretype PKCS12 -deststoretype JKS -srcstorepass 123456 -deststorepass 123456 keytool -list -v -keystore test1.jks -storepass 123456
这里请注意,jks与p12的密码要设成一样的,否则有些时候会无法使用。
生成keystore及cert
#生成私钥 keytool -genkey -validity 10000 -keyalg RSA -dname "CN=neohope OU=neohope O=neohope L=Shanghai C=CN" -keystore node1.jks -alias node1 -keypass password -storepass password #导出证书 keytool -export -file node1.crt -keystore node1.jks -alias node1 -keypass password -storepass password #生成truststore keytool -import -trustcacerts -file node1.crt -keystore trust.jks -alias node1 -keypass password -storepass password #查看 keytool -list -keystore node1.jks keytool -list -keystore trust.jks
jks转p12
keytool -importkeystore -srckeystore node1.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore node1.p12 -srcstorepass password -deststorepass password
::JKS → P12 keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12 ::P12 → JKS keytool -importkeystore -srckeystore keystore.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore keystore.jks
在这里,有一点大家一定要记住,P12的密码和JKS的密码一定要一致,否则很多容器(如Tomcat)无法加载。一般来说,JKS要求密码至少为6位,所以如果P12的密码位数太短,就要修改P12的密码啦:
openssl pkcs12 -in keystore.p12 -out keystore.pem -nodes openssl pkcs12 -export -out keystore1.p12 -in keystore.pem