jetty ssl, digest auth

jettyssldigest.png
参考文献

JettyでSSL for Windows ~オレオレ証明書編
http://d.hatena.ne.jp/yukinkster/20110828/1314563738
JettyにSecurityを。DIGEST認証。
http://d.hatena.ne.jp/nosa1/20120209/1328781334
jetty8でBASIC認証
http://u1aryz.blogspot.jp/2011/12/jetty8basic.html
■[jetty]jettyでのBASIC認証の設定。
http://d.hatena.ne.jp/adon/20040708

jetty-core6.1.14
http://www.java2s.com/Code/JarDownload/jetty/jetty-core-6.1.14.jar.zip

jetty.xml等はすべてリフレクションでメソッドを起こしているわけであるようなので、java code上でもxmlを見ながら機械的にメソッドを起こしていけばいい

	org.eclipse.jetty.server.Server server = new Server();
        ContextHandlerCollection contexts = new ContextHandlerCollection();
        server.setHandler(contexts);
        SocketConnector connector = new SocketConnector();
        connector.setPort(8080);
        server.setConnectors(new Connector[]{connector});
        org.eclipse.jetty.server.ssl.SslSelectChannelConnector sslc = new org.eclipse.jetty.server.ssl.SslSelectChannelConnector();
        sslc.setPort(8443);
        sslc.setMaxIdleTime(30000);
        sslc.setAcceptors(2);
        sslc.setAcceptQueueSize(100);
        sslc.setKeystore("keystore");
        sslc.setPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
        sslc.setKeyPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
        sslc.setTruststore("keystore");
        sslc.setTrustPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
        server.addConnector(sslc);
        
        WebAppContext webAppContext = new WebAppContext();
	webAppContext.setDescriptor(webAppContext + "war/WEB-INF/web.xml");
	webAppContext.setResourceBase("war");
	webAppContext.setContextPath("/");
        org.eclipse.jetty.security.HashLoginService hashLoginService = new org.eclipse.jetty.security.HashLoginService();
        hashLoginService.setName("admin");
        hashLoginService.setConfig("realm.properties");
        hashLoginService.setRefreshInterval(0);
	webAppContext.getSecurityHandler().setLoginService(hashLoginService);
        contexts.addHandler(webAppContext);
        try {    
            server.start();
        }
        catch (java.net.BindException ex) {
            System.exit(-1);
        }

基としたxmlはそれぞれ

同じくjetty-distribution-7.1.6.v20100715/etcディレクトリ中にある

  • keystore
  • realm.propaties

をアプリのホームディレクトリにコピー

web.xmlに以下を加え

   	<security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
    		<role-name>admin</role-name> 
  		</auth-constraint>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
        </security-constraint>
        <login-config>
		<auth-method>DIGEST</auth-method> 
		<realm-name>admin</realm-name> 
	</login-config>
	<security-role>
  		<role-name>admin</role-name> 
	</security-role>

digestした仮に'password'は以下なので、

java -cp ./jetty-core-6.1.14.jar org.mortbay.jetty.security.Password admin password
password
OBF:1v2j1uum1xtv1zej1zer1xtn1uvk1v1v

なお、以下のコードもまたOBF:1v2j1uum1xtv1zej1zer1xtn1uvk1v1vを返す

	    String pass = org.mortbay.jetty.security.Password.obfuscate("password");
	    System.out.println(pass);

realm.propatiesの中身を以下とした

#
# This file defines users passwords and roles for a HashUserRealm
#
# The format is
#  <username>: <password>[,<rolename> ...]
#
# Passwords may be clear text, obfuscated or checksummed.  The class 
# org.eclipse.util.Password should be used to generate obfuscated
# passwords or password checksums
#
# If DIGEST Authentication is used, the password must be in a recoverable
# format, either plain text or OBF:.
#
admin: OBF:1v2j1uum1xtv1zej1zer1xtn1uvk1v1v,admin

なお、sslのkeystoreはこのようにjettyとともに付属品として入手して使いまわしているので、暗号化して通信するものの復号化する秘密鍵もjettyをダウンロードすれば入手できると思われるので(自分の技能では技術的な問題がよくわかっていない)、暗号の解読が面倒になるだけでこの場合には不可能にしているわけではないようなので注意したい。→秘密鍵sslc.setKeyPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g(storepwdと同義)");については自前で再生成させてから利用することにする。セキュリティ概念

    last modified: 14 July 2013 [ View wiki source Close ]
     
SEARCH DIFFERENCE ATTACHMENT RECENT POST