2013-11-06 6 views
2

Я пытаюсь настроить ActiveMQ для взаимной проверки подлинности, чтобы клиенту понадобился сертификат для передачи сообщений брокеру. Я создал хранилище ключей и доверительное управление брокера и экспортировал сертификат, который был скопирован клиенту. На стороне клиента я сделал то же самое, хотя я использую NMS, поэтому я использую только экспортированный сертификат, который я добавил в доверительный магазин брокера. Я также добавил сертификат к сертификатам доверенного корневого каталога локального компьютера.
конфигурации брокера имеет это:ActiveMQ взаимная аутентификация SSL

<transportConnectors> 
    <transportConnector name="ssl" uri="ssl://0.0.0.0:61616"/> 
</transportConnectors> 
<sslContext> 
    <sslContext keyStore="file:${activemq.base}/conf/keystore.jks" 
    keyStorePassword="ksPass" 
    trustStore="file:${activemq.base}/conf/shared.ks" 
    trustStorePassword="ksPass"/> 
</sslContext> 
<plugins> 
<jaasCertificateAuthenticationPlugin configuration="CertLogin" /> 
</plugins> 

AMQ служба wrapper.conf имеет
wrapper.java.additional.8=-Djava.security.auth.login.config="%ACTIVEMQ_CONF%/login.config"

$ {activemq.base} /conf/login.config

CertLogin { 
org.apache.activemq.jaas.TextFileCertificateLoginModule required 
debug=true 
org.apache.activemq.jaas.textfiledn.user="users.properties" 
org.apache.activemq.jaas.textfiledn.group="groups.properties"; 
}; 

$ {activemq.base} /conf/users.properties имеет

user=CN=nms.client.170,\ OU=IT,\ O=MyOrg,\ L=Oslo,\ S=Oslo,\ C=NO 

$ {activemq.base} /conf/groups.properties имеет

admins=system 
users=system,user  

В AppSettings клиента NMS, я использовать это для подключения:

< add key="jms.uri" value="ssl://brokeraddress.in.hosts:61616?needClientAuth=true&amp;wantClientAuth=true&amp;transport.clientCertSubject=nms.client.170&amp;transport.clientCertPassword=ksClientPw&amp;transport.clientCertFilename=C:\TestClient\client170.crt" />  

Если я не имею jaasCertificateAuthenticationPlugin в брокере я могу подключиться через ssl, но с ним (это то, что я имел в виду), я получаю сообщение об ошибке, он не работает в Apache.NMS.ActiveMQ.Connection

Получает ExeptionResponse: «java.lang.SecurityException: невозможно аутентифицировать транспорт без сертификата SSL».

Трассировка показывает:

10:19:16,479 INFO Client.MyTrace - BrokerUri set = ssl://brokeraddress.in.hosts:61616?transport.clientcertpassword=ksClient&transport.clientcertsubject=nms.client.170&needclientauth=true&wantclientauth=true&transport.clientcertfilename=C:\TestClient\client170.crt 
10:19:16,492 DEBUG Client.MyTrace - SetProperties called with target: ConnectionFactory, and prefix: connection. 
10:19:16,492 DEBUG Client.MyTrace - SetProperties called with target: ConnectionFactory, and prefix: nms. 
10:19:16,495 INFO Client.MyTrace - Connecting to: ssl://brokeraddress.in.hosts:61616/?transport.clientcertpassword=ksClient&transport.clientcertsubject=nms.client.170&needclientauth=true&wantclientauth=true&transport.clientcertfilename=C:\TestClient\client170.crt 
10:19:16,497 DEBUG Client.MyTrace - Searching Assembly: Apache.NMS.ActiveMQ for factory of the id: ssl 
10:19:16,549 DEBUG Client.MyTrace - Found the Factory of type Apache.NMS.ActiveMQ.Transport.Tcp.SslTransportFactory for id: ssl 
10:19:16,552 DEBUG Client.MyTrace - Opening socket to: brokeraddress.in.hosts on port: 61616 
10:19:16,554 DEBUG Client.MyTrace - Connected to brokeraddress.in.hosts:61616 using InterNetwork protocol. 
10:19:16,562 DEBUG Client.MyTrace - Creating new instance of the SSL Transport. 
10:19:16,564 DEBUG Client.MyTrace - Creating Inactivity Monitor: 1 
10:19:16,677 DEBUG Client.MyTrace - Authorizing as Client for Server: brokeraddress.in.hosts 
10:19:16,679 DEBUG Client.MyTrace - Attempting to load Client Certificate from file := C:\TestClient\client170.crt 
10:19:16,682 DEBUG Client.MyTrace - Loaded Client Certificate := [Subject] CN=nms.client.170, OU=IT, O=MyOrg, L=Oslo, S=Oslo, C=NO [Issuer] CN=nms.client.170, OU=IT, O=MyOrg, L=Oslo, S=Oslo, C=NO 
10:19:16,684 DEBUG Client.MyTrace - Client is selecting a local certificate from 1 possibilities. 
10:19:16,684 DEBUG Client.MyTrace - Client has selected certificate with Subject = CN=nms.client.170, OU=IT, O=MyOrg, L=Oslo, S=Oslo, C=NO 
10:19:16,969 DEBUG Client.MyTrace - ValidateServerCertificate: Issued By CN=brokeraddress.in.hosts, OU=DataCom, O=MyOrg, L=Oslo, S=Oslo, C=NO 
10:19:16,969 DEBUG Client.MyTrace - Server is Authenticated = True 
10:19:16,970 DEBUG Client.MyTrace - Server is Encrypted = True 
10:19:16,978 DEBUG Client.MyTrace - InactivityMonitor[1]: Read Check time interval: 30000 
10:19:16,978 DEBUG Client.MyTrace - InactivityMonitor[1]: Initial Delay time interval: 10000 
10:19:16,985 DEBUG Client.MyTrace - InactivityMonitor[1]: Write Check time interval: 10000 
10:19:19,017 DEBUG Client.MyTrace - Exception received in the Inactivity Monitor: Unable to read beyond the end of the stream. 
10:19:19,019 DEBUG Client.MyTrace - InactivityMonitor[1].Runner: Task Runner Shut Down 
10:19:19,019 DEBUG Client.MyTrace - InactivityMonitor[1]: Stopped Monitor Threads. 
10:19:19,032 DEBUG Client.MyTrace - Connection[ID:EJPB-56409-635193299565662525-1:0]: Async exception with no exception listener: System.IO.EndOfStreamException: Unable to read beyond the end of the stream. 
System.IO.BinaryRe.FillBuffer(Int32 numBytes) 
System.IO.BinaryRe.ReadInt32() 
Apache.NMS.Util.EnBinaryReader.ReadInt32() in c:\dev\NMS\src\main\csharp\Util\EndianBinaryReader.cs:line 135 
Apache.NMS.ActiveMenWire.OpenWireFormat.Unmarshal(BinaryReader dis) in c:\dev\NMS.ActiveMQ\src\main\csharp\OpenWire\OpenWireFormat.cs:line 228 
Apache.NMS.ActiveMansport.Tcp.TcpTransport.ReadLoop() in c:\dev\NMS.ActiveMQ\src\main\csharp\Transport\Tcp\TcpTransport.cs:line 295 
10:19:19,035 DEBUG Client.MyTrace - TransportFilter disposing of next Transport: MutexTransport 
10:19:19,035 DEBUG Client.MyTrace - TransportFilter disposing of next Transport: WireFormatNegotiator 
10:19:19,036 DEBUG Client.MyTrace - TransportFilter disposing of next Transport: InactivityMonitor 
10:19:19,036 DEBUG Client.MyTrace - InactivityMonitor[1]: Stopped Monitor Threads. 
10:19:19,037 DEBUG Client.MyTrace - TransportFilter disposing of next Transport: SslTransport 
10:19:19,071 INFO Client.MyTrace - Connection[ID:SUSSDEV2-56409-635193299565662525-1:0]: Closing Connection Now. 
10:19:19,073 DEBUG Client.MyTrace - Connection[ID:SUSSDEV2-56409-635193299565662525-1:0]: Disposing of the Transport. 
10:19:19,073 DEBUG Client.MyTrace - InactivityMonitor[1]: Stopped Monitor Threads. 

и в брокере он говорит:

 
INFO | jvm 1 | 10:18:20 | WARN | Failed to add Connection ID:EJPB-56409-635193299565662525-1:0, reason: java.lang.SecurityException: Unable to authenticate transport without SSL certificate. 
INFO | jvm 1 | 10:18:22 | INFO | Stopping tcp://192.168.5.170:56408 because Failed with SecurityException: Unable to authenticate transport without SSL certificate. 

Хорошо, что мне не хватает? В нем говорится, что «транспорт без сертификата SSL», но он выбирает его во время подключения клиента, и он находится в доверительном магазине брокера и Root Certs.

Использование NMS 1.6.0 и activeMQ 5.8.0.
Я также попробовал простой клиент в java с тем же результатом.

 
Exception in thread "main" javax.jms.JMSException: Unable to authenticate transport without SSL certificate. 
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49) 
    at org.apache.activemq.ActiveMQConnection.syncSendPacket (ActiveMQConnection.java:1295) 
    at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent (ActiveMQConnection.java:1392) 
    at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:504) 
    at com.atest.jms.Client.main(Client.java:69) 
Caused by: java.lang.SecurityException: Unable to authenticate transport without SSL certificate. 
    at org.apache.activemq.security.JaasCertificateAuthenticationBroker.addConnection(JaasCertificateAuthenticationBroker.java:74) 
    at org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:91) 
    at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:766) 
    at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79) 
    at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139) 
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:329) 
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:184) 
    at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50) 
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113) 
    at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:288) 
    at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 
    at org.apache.activemq.transport.tcp.SslTransport.doConsume(SslTransport.java:91) 
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214) 
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) 
    at java.lang.Thread.run(Unknown Source)  

У кого-нибудь есть идеи? Благодарю.

Редактировать ноябрь 12

Хорошо, я попробовал еще раз.Я вижу, что я не добавил к transportConnector SSL брокера:

<transportConnector name="ssl" uri="ssl://0.0.0.0:61616?needClientAuth=true"/> 

Я попробовал клиента Java и он может послать, но я все еще получаю сообщение об ошибке для клиента NMS (тот же конфигурации):

15:28:14,044 ERROR Test_DataCom.MyTrace - Exception: A call to SSPI failed, see inner exception. 
15:28:14,045 ERROR Test_DataCom.MyTrace - Inner exception: An unknown error occurred while processing the certificate 
15:28:14,045 ERROR Test_DataCom.MyTrace - Authentication failed - closing the connection. 

и у брокера я получаю нулевой сертификат цепи

INFO | jvm 1 | 15:28:13 | ERROR | Could not accept connection from tcp://192.168.50.170:61978: javax.net.ssl.SSLHandshakeException: null cert chain 

у меня есть сертификаты в доверенных сертификатов и локального компьютера Trusted Root CA друг друга ... что еще нужно? Где он должен найти цепочку сертификатов для самоподписанных сертификатов, если нет?

ответ

1

ОК, похоже, у меня это сейчас. После повторного чтения этого comment я экспортировал сертификат клиента и ключ в файл PKCS и импортировал его в хранилище сертификации текущих пользователей в Windows.
C:\> keytool -v -importkeystore -srckeystore client-keystore.jks -srcalias client -destkeystore client.p12 -deststoretype PKCS12

Тогда я использовал этот URL-закодированы соединение:
<add key="jms.uri" value="ssl://brokeraddress.in.hosts:61616?needClientAuth=true&amp;wantClientAuth=true&amp;transport.clientCertSubject=CN%3Dnms.client.170%2C+OU%3DIT%2C+O%3DMyOrg%2C+L%3DOslo%2C+S%3DOslo%2C+C%3DNO" />

Я также имел
$ {} activemq.base /conf/users.properties: user=CN=nms.client.170,\ OU=IT,\ O=MyOrg,\ L=Oslo,\ S=Oslo,\ C=NO, пытаясь избежать пробелов, то я удалили их и исправили S до ST, так же как keytool сообщает о линии владельца. Я проверил, и это дает ошибку.

Исправленные $ {} activemq.base /conf/users.properties:
user=CN=nms.client.170, OU=IT, O=MyOrg, L=Oslo, ST=Oslo, C=NO

+0

Привет ejpb, Me также облицовочные тот же 'нулевой серт chain' execption. Не могли бы вы рассказать мне, где добавить следующую строку: '' –

+1

Это приложение app.config в проекте NMS который использует ключ «jms.uri». Я обнаружил, что версия файла проще, так как иногда обнаружение сертификата в магазине может быть проблематичным. clientCertSubject, похоже, не работает для установленной по умолчанию службы с учетной записью пользователя Local System, она не находит никаких сертификатов вообще. Запуск в качестве другого пользователя или использование clientCertFilename. ')' является разделителем в обработке запросов NMS, поэтому не размещайте cert в «C: \ Program Files (x86)/folder» и т. Д. «C: \ My files/client.p12» работает (пробел, переадресация и обратная косая черта) – ejpb