Datastax Opscenter 5.1.1 не может подключиться к кластеру после шифрования «клиент-узел»

Я пытаюсь настроить межузловое и клиентское шифрование на cassandra. Я установил небольшой ЦС, сгенерировал сертификаты, распространил их и настроил узлы для их использования.

Межузловое шифрование работало сразу, cqlsh после того, как я добавил «--ssl».

Но я не могу настроить OpsCenter (под управлением 5.1.1). Две проблемы:

  1. Я добавил путь к файлу ca, для себя /etc/opscenter/cassandra_ca.pem, как и просили. Я не могу сохранить кластер, пока не добавлю хранилище ключей, даже если я не поставил отметку для проверки клиента - также я не могу найти никакой документации, какое хранилище ключей здесь имеется в виду. Поскольку OpsCenter - это python, это явно не хранилища ключей jks из cassandra.

Я предполагаю, что это подразумевается таким образом, что отдельные узлы представляют свой сертификат в операционный центр, который проверяет его на соответствие ca-store.

  1. При попытке подключения выдает ошибку в opscenterd.log:
2015-05-26 10:20:49+0000 []  INFO: Using SSL when checking thrift connection: /etc/cassandra/cassandra_ca.crt, client_pem=None, client_key=None, validate=True
2015-05-26 10:20:49+0000 []  INFO: Starting factory <opscenterd.ThriftService.NoReconnectCassandraClientFactory instance at 0x7fa4868c03b0>
2015-05-26 10:20:49+0000 [] Unhandled Error
        Traceback (most recent call last):
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/python/log.py", line 84, in callWithLogger
            return callWithContext({"system": lp}, func, *args, **kw)
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/python/log.py", line 69, in callWithContext
            return context.call({ILogContext: newCtx}, func, *args, **kw)
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/python/context.py", line 59, in callWithContext
            return self.currentContext().callWithContext(ctx, func, *args, **kw)
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/python/context.py", line 37, in callWithContext
            return func(*args,**kw)
        --- <exception caught here> ---
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/internet/epollreactor.py", line 220, in _doReadOrWrite
            why = selectable.doWrite()
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/internet/tcp.py", line 664, in doConnect
            self._connectDone()
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/internet/ssl.py", line 160, in _connectDone
            self.startTLS(self.ctxFactory)
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/internet/tcp.py", line 561, in startTLS
            if Connection.startTLS(self, ctx, client):
          File "/usr/share/opscenter/lib/py-debian/2.7/amd64/twisted/internet/tcp.py", line 402, in startTLS
            self.socket = SSL.Connection(ctx.getContext(), self.socket)
          File "/usr/lib/python2.7/dist-packages/opscenterd/SslUtils.py", line 54, in getContext

          File "/usr/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 303, in load_verify_locations
            raise TypeError("cafile must be None or a byte string")
        exceptions.TypeError: cafile must be None or a byte string

2015-05-26 10:20:49+0000 []  INFO: <twisted.internet.ssl.Connector instance at 0x7fa4868c05f0> will retry in 2 seconds
2015-05-26 10:20:49+0000 []  INFO: Unhandled error in Deferred:
2015-05-26 10:20:49+0000 [] Unhandled Error
        Traceback (most recent call last):
        Failure: twisted.internet.error.ConnectError: An error occurred while connecting: [Failure instance: Traceback (failure with no frames): <type 'exceptions.TypeError'>: cafile must be None or a byte string
        ].            ].

Любые намеки на это?

Заранее спасибо, Ян


person Mandraenke    schedule 26.05.2015    source источник


Ответы (1)


Opscenter нужно настроить несколько вещей для работы с шифрованием «клиент-узел».

  1. Демону Opscenter требуется сертификат для доступа к кластеру (как и любому другому клиенту). Это должно производиться с помощью того же процесса, который задокументирован на стороне DSE. Ключи JKS необходимы, если Cassandra использует их для шифрования.
  2. Сертификат Opscenterd необходимо зарегистрировать в хранилище доверенных сертификатов, указанном в cassandra.yaml.
  3. Агентам необходимо знать путь к хранилищу ключей, на прием которого настроена Cassandra. Самый простой способ — указать им хранилище ключей, указанное в cassandra.yaml.

При добавлении кластера в opscenter запросит расположение сертификата (для opscenterd) и расположение хранилища ключей (для каждого узла cassandra).

person mildewey    schedule 26.05.2015
comment
Спасибо за ваш ответ. Я уже создаю полную PKI - cassandra_ca как корневой центр сертификации, и все остальные подписаны из него, и он также находится в моем хранилище доверенных сертификатов, и в моих хранилищах ключей есть сертификаты для каждого узла, подписанные моим центром сертификации. Это прекрасно работает для всех межузловых коммуникаций. Но для opscenter - я подумал, что мне нужен сертификат CA, поскольку он закодирован PEM, и указал путь к нему в opscenter als CA Certificate File Path. Но я получил ошибку от переплетенного python - жалуюсь, что он ожидает None или байтовую строку как cafile. Может это баг? - person Mandraenke; 27.05.2015
comment
Я могу только утверждать, что протестировал его с частным сертификатом, используя тот же тип ключа JKS, который я настроил для использования в C*. - person mildewey; 27.05.2015
comment
Как вы создали свой сертификат PEM? - person mildewey; 27.05.2015
comment
Я создал их с помощью XCA или с помощью openssl. Насколько я вижу, это какая-то ошибка, и я пошагово выполняю код. - person Mandraenke; 28.05.2015