2017-05-19 8 views
0

私は、SNMPv3の認証方法として証明書や鍵を使用できるようにしたいプロジェクトに取り組んでいます。私たちはJavaライブラリSNMP4Jを使用しています。SNMP4Jで非対称キーまたは証明書認証をどのように使用しますか?

私の研究では、SNMPがTLS/DTLSをメッセージの暗号化や認証のために使用していることがわかりました。 Source 1 | Source 2 | Source 3

SNMP4Jが持っている小さなドキュメントを見ると、トラフィックの暗号化にTLS証明書を使用できることがわかりました。しかし、公開鍵/秘密鍵のペアを使用して、可能であれば認証がどのように行われるのかよくわかりません。 | SNMP4J Documentation

ご協力いただければ幸いです。

答えて

0

私は、例TLS Traffic Encryption Exampleに記載されているのと同様の方法を使用して認証することができました。 1の例から期待通り

だから、私はSNMP4Jは、Javaプロパティjavax.net.ssl.keystorejavax.net.ssl.keyStorePasswordjavax.net.ssl.trustStore、およびjavax.net.ssl.trustStorePasswordに設定されたキーストアを使用していることを確認することができます。

以下に、この例を変更して動作させる方法を示します。

コンストラクタでエイリアス(またはドキュメントのセキュリティ名)を設定して、使用する証明書を知る必要があります。

CertifiedTarget ct = new CertifiedTarget(new OctetString(alias)); 

セキュリティレベルを設定する必要があります。そうしないと、SNMPエージェントが認証に失敗し、認証に失敗します。

ct.setSecurityLevel(SecurityLevel.AUTH_PRIV); 

SecurityCallback対象DNは、それはそれ以外の場合は、すべての応答を拒否します望んでいるEXACTLY方法サーバー証明書のサブジェクトと一致する必要があります。

securityCallback.addAcceptedSubjectDN("[email protected], CN=snmpagent, OU=Development, O=Net-SNMP, L=Davis, ST=CA, C=US"); 

最後に、サーバーの公開証明書エイリアス(セキュリティ名)をアドレスに登録する必要があります。

securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagent"); 

このように表示されます。

// Set java keystore manually 
System.setProperty("javax.net.ssl.keyStore", KEYSTORE_DIR); 
System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 
System.setProperty("javax.net.ssl.trustStore", KEYSTORE_DIR); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

// create the TLS transport mapping: 
TLSTM transport = new TLSTM(); 

// set the security callback (only required for command responder, 
// but also recommended for command generators) - 
// the callback will be configured later: 
DefaultTlsTmSecurityCallback securityCallback = new DefaultTlsTmSecurityCallback(); 
((TLSTM) transport).setSecurityCallback(securityCallback); 
MessageDispatcher md = new MessageDispatcherImpl(); 
// we need MPv3 for TLSTM: 
MPv3 mpv3 = new MPv3(); 
md.addMessageProcessingModel(mpv3); 

Snmp snmp = new Snmp(md, transport); 

// create and initialize the TransportSecurityModel TSM: 
SecurityModels.getInstance().addSecurityModel(new TSM(new OctetString(mpv3.getLocalEngineID()), false)); 

// do not forget to listen for responses: 
snmp.listen(); 

CertifiedTarget ct = new CertifiedTarget(new OctetString("alias")); 
ct.setVersion(SnmpConstants.version3); 
ct.setSecurityModel(SecurityModel.SECURITY_MODEL_TSM); 
ct.setAddress(GenericAddress.parse(myAddress)); 
ct.setSecurityLevel(SecurityLevel.AUTH_PRIV); 

securityCallback.addAcceptedSubjectDN("[email protected], CN=snmpagent, OU=Development, O=Net-SNMP, L=Davis, ST=CA, C=US"); 
securityCallback.addLocalCertMapping(ct.getAddress(), "snmpagentalias"); 

PDU pdu = new ScopedPDU(); 
pdu.add(new VariableBinding(new OID(someOid))); 
pdu.setType(PDU.GET); 

ResponseEvent response = snmp.send(pdu, ct); 

また、すべての証明書が実際に正しく設定されていることを確認する必要があります。

私のチームの発見で、主にトランスポート層でSNMP4JによるTLS処理にいくつかのバグが発見されました。これはSNMPデータを取得して無視するタイミングの問題(競合状態かもしれません)のようです。 CertifiedTargetタイムアウトを設定して再試行し、本当に再試行できました。私たちは、より多くの情報があるとき、正式に報告します。

+0

ありがとうございます。しかし、最後に、サーバー公開証明書エイリアス(セキュリティ名)をアドレスに登録する必要があります。 securityCallback.addLocalCertMapping(ct.getAddress()、 "snmpagent"); "具体的には、「サーバー公開証明書エイリアス」とはどういう意味ですか?これは "CertifiedTarget ct = new CertifiedTarget(new OctetString(alias));"で設定されたエイリアスと同じですか? – stoneboy

関連する問題