📄 sesecuritymanagerimpl.java
字号:
key_store.load(null,null);
}else{
InputStream kis = null;
try{
kis = new FileInputStream(keystore_name);
key_store.load(kis, SESecurityManager.SSL_PASSWORD.toCharArray());
}finally{
if ( kis != null ){
kis.close();
}
}
}
keyManagerFactory.init(key_store, SESecurityManager.SSL_PASSWORD.toCharArray());
return( key_store );
}
public SSLServerSocketFactory
getSSLServerSocketFactory()
throws Exception
{
if ( !checkKeyStoreHasEntry()){
return( null );
}
SSLContext context = SSLContext.getInstance( "SSL" );
// Create the key manager factory used to extract the server key
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
loadKeyStore(keyManagerFactory);
// Initialize the context with the key managers
context.init(
keyManagerFactory.getKeyManagers(),
null,
new java.security.SecureRandom());
SSLServerSocketFactory factory = context.getServerSocketFactory();
return( factory );
}
public SEKeyDetails
getKeyDetails(
String alias )
throws Exception
{
// Create the key manager factory used to extract the server key
KeyStore key_store = loadKeyStore();
final Key key = key_store.getKey( alias, SESecurityManager.SSL_PASSWORD.toCharArray());
if ( key == null ){
return( null );
}
java.security.cert.Certificate[] chain = key_store.getCertificateChain( alias );
final X509Certificate[] res = new X509Certificate[chain.length];
for (int i=0;i<chain.length;i++){
if ( !( chain[i] instanceof X509Certificate )){
throw( new Exception( "Certificate chain must be comprised of X509Certificate entries"));
}
res[i] = (X509Certificate)chain[i];
}
return( new SEKeyDetails()
{
public Key
getKey()
{
return( key );
}
public X509Certificate[]
getCertificateChain()
{
return( res );
}
});
}
public Certificate
createSelfSignedCertificate(
String alias,
String cert_dn,
int strength )
throws Exception
{
return( SESecurityManagerBC.createSelfSignedCertificate( this, alias, cert_dn, strength ));
}
public SSLSocketFactory
installServerCertificates(
URL https_url )
{
try{
this_mon.enter();
String host = https_url.getHost();
int port = https_url.getPort();
if ( port == -1 ){
port = 443;
}
SSLSocket socket = null;
try{
// to get the server certs we have to use an "all trusting" trust manager
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory factory = sc.getSocketFactory();
socket = (SSLSocket)factory.createSocket(host, port);
socket.startHandshake();
java.security.cert.Certificate[] serverCerts = socket.getSession().getPeerCertificates();
if ( serverCerts.length == 0 ){
return( null );
}
java.security.cert.Certificate cert = serverCerts[0];
java.security.cert.X509Certificate x509_cert;
if ( cert instanceof java.security.cert.X509Certificate ){
x509_cert = (java.security.cert.X509Certificate)cert;
}else{
java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509");
x509_cert = (java.security.cert.X509Certificate)cf.generateCertificate(new ByteArrayInputStream(cert.getEncoded()));
}
String resource = https_url.toString();
int param_pos = resource.indexOf("?");
if ( param_pos != -1 ){
resource = resource.substring(0,param_pos);
}
for (int i=0;i<certificate_listeners.size();i++){
if (((SECertificateListener)certificate_listeners.get(i)).trustCertificate( resource, x509_cert )){
String alias = host.concat(":").concat(String.valueOf(port));
return( addCertToTrustStore( alias, cert ));
}
}
return( null );
}catch( Throwable e ){
Debug.printStackTrace( e );
return( null );
}finally{
if ( socket != null ){
try{
socket.close();
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}
}finally{
this_mon.exit();
}
}
protected void
addCertToKeyStore(
String alias,
Key public_key,
java.security.cert.Certificate[] certChain )
throws Exception
{
try{
this_mon.enter();
KeyStore key_store = loadKeyStore();
if( key_store.containsAlias( alias )){
key_store.deleteEntry( alias );
}
key_store.setKeyEntry( alias, public_key, SESecurityManager.SSL_PASSWORD.toCharArray(), certChain );
FileOutputStream out = null;
try{
out = new FileOutputStream(keystore_name);
key_store.store(out, SESecurityManager.SSL_PASSWORD.toCharArray());
}catch( Throwable e ){
Debug.printStackTrace( e );
}finally{
if ( out != null ){
out.close();
}
}
}finally{
this_mon.exit();
}
}
protected SSLSocketFactory
addCertToTrustStore(
String alias,
java.security.cert.Certificate cert )
throws Exception
{
try{
this_mon.enter();
KeyStore keystore = getTrustStore();
if ( cert != null ){
if ( keystore.containsAlias( alias )){
keystore.deleteEntry( alias );
}
keystore.setCertificateEntry(alias, cert);
FileOutputStream out = null;
try{
out = new FileOutputStream(truststore_name);
keystore.store(out, SESecurityManager.SSL_PASSWORD.toCharArray());
}finally{
if ( out != null ){
out.close();
}
}
}
// pick up the changed trust store
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory factory = ctx.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory( factory );
return( factory );
}finally{
this_mon.exit();
}
}
public PasswordAuthentication
getPasswordAuthentication(
String realm,
URL tracker )
{
Object[] handler = (Object[])password_handlers.get(tracker.toString());
if ( handler != null ){
return(((SEPasswordListener)handler[0]).getAuthentication( realm, (URL)handler[1] ));
}
List listeners_ref;
try{
this_mon.enter();
listeners_ref = new ArrayList( password_listeners );
}finally{
this_mon.exit();
}
for (int i=0;i<listeners_ref.size();i++){
PasswordAuthentication res = ((SEPasswordListener)listeners_ref.get(i)).getAuthentication( realm, tracker );
if ( res != null ){
return( res );
}
}
return( null );
}
public void
setPasswordAuthenticationOutcome(
String realm,
URL tracker,
boolean success )
{
for (int i=0;i<password_listeners.size();i++){
((SEPasswordListener)password_listeners.get(i)).setAuthenticationOutcome( realm, tracker, success );
}
}
public void
addPasswordListener(
SEPasswordListener l )
{
try{
this_mon.enter();
password_listeners.add(l);
}finally{
this_mon.exit();
}
}
public void
removePasswordListener(
SEPasswordListener l )
{
try{
this_mon.enter();
password_listeners.remove(l);
}finally{
this_mon.exit();
}
}
public void
addPasswordHandler(
URL url,
SEPasswordListener l )
{
String url_s = url.getProtocol() + "://" + url.getHost() + ":" + url.getPort() + "/";
password_handlers.put( url_s, new Object[]{ l, url });
}
public void
removePasswordHandler(
URL url,
SEPasswordListener l )
{
Ignore.ignore( l );
String url_s = url.getProtocol() + "://" + url.getHost() + ":" + url.getPort() + "/";
password_handlers.remove( url_s );
}
public void
addCertificateListener(
SECertificateListener l )
{
try{
this_mon.enter();
certificate_listeners.add(l);
}finally{
this_mon.exit();
}
}
public void
removeCertificateListener(
SECertificateListener l )
{
try{
this_mon.enter();
certificate_listeners.remove(l);
}finally{
this_mon.exit();
}
}
public static void
main(
String[] args )
{
SESecurityManagerImpl man = SESecurityManagerImpl.getSingleton();
man.initialise();
try{
man.createSelfSignedCertificate( "SomeAlias", "CN=fred,OU=wap,O=wip,L=here,ST=there,C=GB", 1000 );
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -