运行公证服务

预计阅读时间:8分钟

本文档适用于任何想要运行自己的Notary服务的人(例如那些想要将Notary与私有Docker注册表一起使用的人)。运行公证服务要求您已经熟悉Docker EngineDocker Compose的使用

运行服务以进行测试或开发

为测试和开发目的而启动完整的Notary服务的最快方法是在Notary项目中使用Docker compose文件 。

$ git clone https://github.com/theupdateframework/notary.git
$ cd notary
$ docker-compose up

这将构建开发Notary服务器和Notary签名者映像,并为它们共同共享的Notary服务器,Notary签名者和MySQL数据库启动容器。MySQL数据存储在一个卷中。

公证服务器和公证签名人通过相互认证的TLS(使用存储库中的自签名测试证书)进行通信,并且公证服务器在端口4443上侦听HTTPS流量。

默认情况下,此开发Notary服务器容器与测试自签名TLS证书一起运行。在成功连接之前,必须使用中的根CA文件fixtures/root-ca.crt

例如,使用OpenSSL进行连接:

$ openssl s_client -connect <docker host>:4443 -CAfile fixtures/root-ca.crt -no_ssl3 -no_ssl2

要使用Notary Client CLI连接,请参阅“入门”。公证服务器和签名者的版本必须大于或等于公证客户端CLI的版本,以确保功能兼容。例如,如果您使用Notary Client CLI 0.2,则服务器和签名者各自也都必须至少为0.2版本。

自签名证书的使用者名称和使用者替代名称分别为 notary-servernotaryserverlocalhost,因此,如果您的Docker主机未开启localhost(例如,如果您使用Docker Machine),请更新主机文件,以使该名称notary-server与的IP地址相关联。您的Docker主机。

进阶设定选项

公证服务器和公证签名人都采用 JSON配置文件。预先构建的映像(例如上面开发映像) 为您提供了这些配置文件以及一些合理的默认值。

但是,对于在生产环境中运行,或者如果您只想更改开发服务上的那些默认值,则可能要更改这些默认值。

使用不同的命令行参数运行

docker run如果要传递其他命令行选项,则可以覆盖图像的命令。公证人服务器和公证人签名人均采用以下命令行参数:

  • -config=<config file> -指定JSON配置文件的路径。

  • -debug-传递此标志将启用上的调试服务器localhost:8080。调试服务器提供 pprofexpvar端点。(请记住,相对于正在运行的容器,这是本地主机-该端点未从容器中公开)。

    也可以在配置文件中设置此选项。

  • -logf=<format>-此标志设置日志的输出格​​式。可能的格式为“ json”和“ logfmt”。

    无法在配置文件中设置此选项,因为在读取配置文件之前会在启动时生成一些日志消息。

指定您自己的配置文件

您可以完全使用自己的配置文件运行映像。您只需要挂载配置目录,然后将路径传递到该配置文件作为docker run命令的参数。

使用环境变量覆盖配置文件参数

您还可以通过设置形式为NOTARY_SERVER_<var>或的 环境变量来覆盖配置的参数NOTARY_SIGNER_<var>

var"_"配置JSON顶层的键的ALL- CAPS-分隔路径。

例如,如果要覆盖公证服务器配置的存储URL,请执行以下操作:

{
  "storage": {
    "backend": "mysql",
    "db_url": "dockercondemo:dockercondemo@tcp(notary-mysql)/dockercondemo"
  }
}

您将需要设置环境变量NOTARY_SERVER_STORAGE_DB_URL,因为在Notary服务器配置JSONdb_urlstorage部分中。

您无法覆盖其值为另一个映射的键。例如,设置 NOTARY_SERVER_STORAGE='{"storage": {"backend": "memory"}}'不会设置内存存储。它只是无法解析。您只能覆盖其值为字符串或数字的键。

例如,假设您要运行一个公证服务器实例:

  • 使用您自己的TLS证书和密钥
  • 使用本地的内存中签名人服务,而不是使用公证人签名人
  • 使用本地内存中的TUF元数据存储,而不是使用MySQL
  • 产生JSON格式的日志

一种方法是:

  1. 生成自己的TLS证书和密钥server.crtserver.key,并把他们在目录中/tmp/server-configdir

  2. 将以下配置文件写入/tmp/server-configdir/config.json

{
  "server": {
    "http_addr": ":4443",
    "tls_key_file": "./server.key",
    "tls_cert_file": "./server.crt"
  },
  "trust_service": {
    "type": "remote",
    "hostname": "notarysigner",
    "port": "7899",
    "tls_ca_file": "./root-ca.crt",
    "key_algorithm": "ecdsa",
    "tls_client_cert": "./notary-server.crt",
    "tls_client_key": "./notary-server.key"
  },
  "storage": {
    "backend": "mysql",
    "db_url": "server@tcp(mysql:3306)/notaryserver?parseTime=True"
  }
}
NWe include a remote trust service and a database storage
type to demonstrate how environment variables can override
configuration parameters.
  1. 运行以下命令(假设您已经构建或提取了Notary服务器docker映像):
$ docker run \
    -p "4443:4443" \
    -v /tmp/server-configdir:/etc/docker/notary-server/ \
    -e NOTARY_SERVER_TRUST_SERVICE_TYPE=local \
    -e NOTARY_SERVER_STORAGE_BACKEND=memory \
    -e NOTARY_SERVER_LOGGING_LEVEL=debug \
    notary_server \
        -config=/etc/docker/notary-server/config.json \
        -logf=json

{"level":"info","msg":"Version: 0.2, Git commit: 619f8cf","time":"2016-02-25T00:53:59Z"}
{"level":"info","msg":"Using local signing service, which requires ED25519. Ignoring all other trust_service parameters, including keyAlgorithm","time":"2016-02-25T00:53:59Z"}
{"level":"info","msg":"Using memory backend","time":"2016-02-25T00:53:59Z"}
{"level":"info","msg":"Starting Server","time":"2016-02-25T00:53:59Z"}
{"level":"info","msg":"Enabling TLS","time":"2016-02-25T00:53:59Z"}
{"level":"info","msg":"Starting on :4443","time":"2016-02-25T00:53:59Z"}

您可以通过设置卷,环境变量并覆盖Compose文件中的Notary服务器容器的默认命令来使用Docker Compose进行相同 的操作。

在生产中部署的建议

从开发过渡到生产时,必须考虑许多因素以确保安全性和可伸缩性。

证明书

公证存储库在fixtures目录中包括样本证书。当使用提供的docker-compose.yml 文件初始化开发服务时,这些示例证书将用于创建更像生产的环境。

您必须获取自己的证书才能在生产部署中使用。

公证存储库中的示例私钥文件显然是公共知识,并且在生产部署中使用它们是高度不安全的。

证书目录

Notary是一个基于用户/客户端的系统,它在用户的主目录中的位置搜索证书~/.docker/trust。要从命令行使用Notary进行精简,请创建一个别名,该别名将用户trust目录映射到系统ca-certificates目录。

$ alias notary="notary -s https://<dtr-url> -d ~/.docker/trust --tlscacert /usr/local/share/ca-certificates/<dtr-url>.crt"

资料库

服务器和签名者每个都需要一个数据库。这些应该是具有不同用户的单独数据库。应该限制​​用户的权限。我们建议向仅限于自己的数据库的用户授予以下MySQL(或同等权限)权限:

  • 公证服务器数据库用户: SELECT, INSERT, UPDATE, DELETE
  • 公证签名人数据库用户: SELECT, INSERT, DELETE

高可用性

为了提高可用性,您可以同时运行服务器和签名者应用程序的多个实例。这些可以任意和独立地扩展。数据库也可以独立扩展,但这是经验丰富的DBA和操作团队的练习。典型的部署如下所示:

公证服务器部署图

在该图中,负载平衡器将外部流量路由到Notary服务器实例的集群。如果需要a)签名或b)密钥生成,则这些请求可以向公证人签名者实例发出请求。从公证服务器到公证签名者群集的请求是通过内部负载平衡器进行的路由器。

公证人可以与CDN或其他缓存系统一起使用。除以下URL匹配外,所有对JSON文件的GET请求都可以无限期缓存:

  • */root.json
  • */timestamp.json

对JSON文件的所有其他请求都包含所请求文件的sha256校验和,因此是不可变的。JSON文件请求占所有公证请求的绝大部分。对于JSON文件GET以外的任何请求的请求均不应缓存。

码头工人公证人公证人服务器公证人服务器公证人签名人公证人签名人