github.com/simranvc/fabric-ca@v0.0.0-20191030094829-acc364294dde/docs/source/users-guide.rst (about) 1 Fabric CA User's Guide 2 ====================== 3 4 The Hyperledger Fabric CA is a Certificate Authority (CA) 5 for Hyperledger Fabric. 6 7 It provides features such as: 8 9 * registration of identities, or connects to LDAP as the user 10 registry 11 * issuance of Enrollment Certificates (ECerts) 12 * certificate renewal and revocation 13 14 Hyperledger Fabric CA consists of both a server and a client component as 15 described later in this document. 16 17 For developers interested in contributing to Hyperledger Fabric CA, see the 18 `Fabric CA repository <https://github.com/hyperledger/fabric-ca>`__ for more 19 information. 20 21 22 .. _Back to Top: 23 24 Table of Contents 25 ----------------- 26 27 1. `Overview`_ 28 29 2. `Getting Started`_ 30 31 1. `Prerequisites`_ 32 2. `Install`_ 33 3. `Explore the Fabric CA CLI`_ 34 35 3. `Configuration Settings`_ 36 37 1. `A word on file paths`_ 38 39 4. `Fabric CA Server`_ 40 41 1. `Initializing the server`_ 42 2. `Starting the server`_ 43 3. `Configuring the database`_ 44 4. `Configuring LDAP`_ 45 5. `Setting up a cluster`_ 46 6. `Setting up multiple CAs`_ 47 7. `Enrolling an intermediate CA`_ 48 8. `Upgrading the server`_ 49 9. `Operations Service`_ 50 51 5. `Fabric CA Client`_ 52 53 1. `Enrolling the bootstrap identity`_ 54 2. `Registering a new identity`_ 55 3. `Enrolling a peer identity`_ 56 4. `Getting Identity Mixer credential`_ 57 5. `Getting Idemix CRI (Certificate Revocation Information)`_ 58 6. `Reenrolling an identity`_ 59 7. `Revoking a certificate or identity`_ 60 8. `Generating a CRL (Certificate Revocation List)`_ 61 9. `Attribute-Based Access Control`_ 62 10. `Dynamic Server Configuration Update`_ 63 11. `Enabling TLS`_ 64 12. `Contact specific CA instance`_ 65 66 6. `Configuring an HSM`_ 67 68 1. `Example`_ 69 70 7. `File Formats`_ 71 72 1. `Fabric CA server's configuration file format`_ 73 2. `Fabric CA client's configuration file format`_ 74 75 8. `Troubleshooting`_ 76 77 78 Overview 79 -------- 80 81 The diagram below illustrates how the Hyperledger Fabric CA server fits into the 82 overall Hyperledger Fabric architecture. 83 84 .. image:: ./images/fabric-ca.png 85 86 There are two ways of interacting with a Hyperledger Fabric CA server: 87 via the Hyperledger Fabric CA client or through one of the Fabric SDKs. 88 All communication to the Hyperledger Fabric CA server is via REST APIs. 89 See `fabric-ca/swagger/swagger-fabric-ca.json` for the swagger documentation 90 for these REST APIs. 91 You may view this documentation via the http://editor2.swagger.io online editor. 92 93 The Hyperledger Fabric CA client or SDK may connect to a server in a cluster 94 of Hyperledger Fabric CA servers. This is illustrated in the top right section 95 of the diagram. The client routes to an HA Proxy endpoint which load balances 96 traffic to one of the fabric-ca-server cluster members. 97 98 All Hyperledger Fabric CA servers in a cluster share the same database for 99 keeping track of identities and certificates. If LDAP is configured, the identity 100 information is kept in LDAP rather than the database. 101 102 A server may contain multiple CAs. Each CA is either a root CA or an 103 intermediate CA. Each intermediate CA has a parent CA which is either a 104 root CA or another intermediate CA. 105 106 Getting Started 107 --------------- 108 109 Prerequisites 110 ~~~~~~~~~~~~~~~ 111 112 - Go 1.10+ installation 113 - ``GOPATH`` environment variable is set correctly 114 - libtool and libtdhl-dev packages are installed 115 116 The following installs the libtool dependencies on Ubuntu: 117 118 .. code:: bash 119 120 sudo apt install libtool libltdl-dev 121 122 The following installs the libtool dependencies on MacOSX: 123 124 .. code:: bash 125 126 brew install libtool 127 128 .. note:: libtldl-dev is not necessary on MacOSX if you instal 129 libtool via Homebrew 130 131 For more information on libtool, see https://www.gnu.org/software/libtool. 132 133 For more information on libltdl-dev, see https://www.gnu.org/software/libtool/manual/html_node/Using-libltdl.html. 134 135 Install 136 ~~~~~~~ 137 138 The following installs both the `fabric-ca-server` and `fabric-ca-client` binaries 139 in $GOPATH/bin. 140 141 .. code:: bash 142 143 go get -u github.com/hyperledger/fabric-ca/cmd/... 144 145 Note: If you have already cloned the fabric-ca repository, make sure you are on the 146 master branch before running the 'go get' command above. Otherwise, you might see the 147 following error: 148 149 :: 150 151 <gopath>/src/github.com/hyperledger/fabric-ca; git pull --ff-only 152 There is no tracking information for the current branch. 153 Please specify which branch you want to merge with. 154 See git-pull(1) for details. 155 156 git pull <remote> <branch> 157 158 If you wish to set tracking information for this branch you can do so with: 159 160 git branch --set-upstream-to=<remote>/<branch> tlsdoc 161 162 package github.com/hyperledger/fabric-ca/cmd/fabric-ca-client: exit status 1 163 164 Start Server Natively 165 ~~~~~~~~~~~~~~~~~~~~~ 166 167 The following starts the `fabric-ca-server` with default settings. 168 169 .. code:: bash 170 171 fabric-ca-server start -b admin:adminpw 172 173 The `-b` option provides the enrollment ID and secret for a bootstrap 174 administrator; this is required if LDAP is not enabled with the "ldap.enabled" 175 setting. 176 177 A default configuration file named `fabric-ca-server-config.yaml` 178 is created in the local directory which can be customized. 179 180 Start Server via Docker 181 ~~~~~~~~~~~~~~~~~~~~~~~ 182 183 Docker Hub 184 ^^^^^^^^^^^^ 185 186 Go to: https://hub.docker.com/r/hyperledger/fabric-ca/tags/ 187 188 Find the tag that matches the architecture and version of fabric-ca 189 that you want to pull. 190 191 Navigate to `$GOPATH/src/github.com/hyperledger/fabric-ca/docker/server` 192 and open up docker-compose.yml in an editor. 193 194 Change the `image` line to reflect the tag you found previously. The file 195 may look like this for an x86 architecture for version beta. 196 197 .. code:: yaml 198 199 fabric-ca-server: 200 image: hyperledger/fabric-ca:x86_64-1.0.0-beta 201 container_name: fabric-ca-server 202 ports: 203 - "7054:7054" 204 environment: 205 - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server 206 volumes: 207 - "./fabric-ca-server:/etc/hyperledger/fabric-ca-server" 208 command: sh -c 'fabric-ca-server start -b admin:adminpw' 209 210 Open up a terminal in the same directory as the docker-compose.yml file 211 and execute the following: 212 213 .. code:: bash 214 215 # docker-compose up -d 216 217 This will pull down the specified fabric-ca image in the Compose file 218 if it does not already exist, and start an instance of the fabric-ca 219 server. 220 221 Building Your Own Docker image 222 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 223 224 You can build and start the server via Docker Compose as shown below. 225 226 .. code:: bash 227 228 cd $GOPATH/src/github.com/hyperledger/fabric-ca 229 make docker 230 cd docker/server 231 docker-compose up -d 232 233 The hyperledger/fabric-ca Docker image contains both the fabric-ca-server and 234 the fabric-ca-client. 235 236 .. code:: bash 237 238 # cd $GOPATH/src/github.com/hyperledger/fabric-ca 239 # FABRIC_CA_DYNAMIC_LINK=true make docker 240 # cd docker/server 241 # docker-compose up -d 242 243 Explore the Fabric CA CLI 244 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 246 This section simply provides the usage messages for the Fabric CA server and client 247 for convenience. Additional usage information is provided in following sections. 248 249 The following links shows the :doc:`Server Command Line <servercli>` and 250 :doc:`Client Command Line <clientcli>`. 251 252 .. note:: Note that command line options that are string slices (lists) can be 253 specified either by specifying the option with comma-separated list 254 elements or by specifying the option multiple times, each with a 255 string value that make up the list. For example, to specify 256 ``host1`` and ``host2`` for the ``csr.hosts`` option, you can either 257 pass ``--csr.hosts 'host1,host2'`` or 258 ``--csr.hosts host1 --csr.hosts host2``. When using the former format, 259 please make sure there are no space before or after any commas. 260 261 `Back to Top`_ 262 263 Configuration Settings 264 ~~~~~~~~~~~~~~~~~~~~~~ 265 266 The Fabric CA provides 3 ways to configure settings on the Fabric CA server 267 and client. The precedence order is: 268 269 1. CLI flags 270 2. Environment variables 271 3. Configuration file 272 273 In the remainder of this document, we refer to making changes to 274 configuration files. However, configuration file changes can be 275 overridden through environment variables or CLI flags. 276 277 For example, if we have the following in the client configuration file: 278 279 .. code:: yaml 280 281 tls: 282 # Enable TLS (default: false) 283 enabled: false 284 285 # TLS for the client's listenting port (default: false) 286 certfiles: 287 client: 288 certfile: cert.pem 289 keyfile: 290 291 The following environment variable may be used to override the ``cert.pem`` 292 setting in the configuration file: 293 294 .. code:: bash 295 296 export FABRIC_CA_CLIENT_TLS_CLIENT_CERTFILE=cert2.pem 297 298 If we wanted to override both the environment variable and configuration 299 file, we can use a command line flag. 300 301 .. code:: bash 302 303 fabric-ca-client enroll --tls.client.certfile cert3.pem 304 305 The same approach applies to fabric-ca-server, except instead of using 306 ``FABIRC_CA_CLIENT`` as the prefix to environment variables, 307 ``FABRIC_CA_SERVER`` is used. 308 309 .. _server: 310 311 A word on file paths 312 ^^^^^^^^^^^^^^^^^^^^^ 313 All the properties in the Fabric CA server and client configuration file 314 that specify file names support both relative and absolute paths. 315 Relative paths are relative to the config directory, where the 316 configuration file is located. For example, if the config directory is 317 ``~/config`` and the tls section is as shown below, the Fabric CA server 318 or client will look for the ``root.pem`` file in the ``~/config`` 319 directory, ``cert.pem`` file in the ``~/config/certs`` directory and the 320 ``key.pem`` file in the ``/abs/path`` directory 321 322 .. code:: yaml 323 324 tls: 325 enabled: true 326 certfiles: 327 - root.pem 328 client: 329 certfile: certs/cert.pem 330 keyfile: /abs/path/key.pem 331 332 `Back to Top`_ 333 334 335 336 Fabric CA Server 337 ---------------- 338 339 This section describes the Fabric CA server. 340 341 You may initialize the Fabric CA server before starting it. This provides an 342 opportunity for you to generate a default configuration file that can be 343 reviewed and customized before starting the server. 344 345 The Fabric CA server's home directory is determined as follows: 346 - if the --home command line option is set, use its value 347 - otherwise, if the ``FABRIC_CA_SERVER_HOME`` environment variable is set, use 348 its value 349 - otherwise, if ``FABRIC_CA_HOME`` environment variable is set, use 350 its value 351 - otherwise, if the ``CA_CFG_PATH`` environment variable is set, use 352 its value 353 - otherwise, use current working directory 354 355 For the remainder of this server section, we assume that you have set 356 the ``FABRIC_CA_HOME`` environment variable to 357 ``$HOME/fabric-ca/server``. 358 359 The instructions below assume that the server configuration file exists 360 in the server's home directory. 361 362 .. _initialize: 363 364 Initializing the server 365 ~~~~~~~~~~~~~~~~~~~~~~~ 366 367 Initialize the Fabric CA server as follows: 368 369 .. code:: bash 370 371 fabric-ca-server init -b admin:adminpw 372 373 The ``-b`` (bootstrap identity) option is required for initialization when 374 LDAP is disabled. At least one bootstrap identity is required to start the 375 Fabric CA server; this identity is the server administrator. 376 377 The server configuration file contains a Certificate Signing Request (CSR) 378 section that can be configured. The following is a sample CSR. 379 380 .. _csr-fields: 381 382 .. code:: yaml 383 384 cn: fabric-ca-server 385 names: 386 - C: US 387 ST: "North Carolina" 388 L: 389 O: Hyperledger 390 OU: Fabric 391 hosts: 392 - host1.example.com 393 - localhost 394 ca: 395 expiry: 131400h 396 pathlength: 1 397 398 All of the fields above pertain to the X.509 signing key and certificate which 399 is generated by the ``fabric-ca-server init``. This corresponds to the 400 ``ca.certfile`` and ``ca.keyfile`` files in the server's configuration file. 401 The fields are as follows: 402 403 - **cn** is the Common Name 404 - **O** is the organization name 405 - **OU** is the organizational unit 406 - **L** is the location or city 407 - **ST** is the state 408 - **C** is the country 409 410 If custom values for the CSR are required, you may customize the configuration 411 file, delete the files specified by the ``ca.certfile`` and ``ca.keyfile`` 412 configuration items, and then run the ``fabric-ca-server init -b admin:adminpw`` 413 command again. 414 415 The ``fabric-ca-server init`` command generates a self-signed CA certificate 416 unless the ``-u <parent-fabric-ca-server-URL>`` option is specified. 417 If the ``-u`` is specified, the server's CA certificate is signed by the 418 parent Fabric CA server. 419 In order to authenticate to the parent Fabric CA server, the URL must 420 be of the form ``<scheme>://<enrollmentID>:<secret>@<host>:<port>``, where 421 <enrollmentID> and <secret> correspond to an identity with an 'hf.IntermediateCA' 422 attribute whose value equals 'true'. 423 The ``fabric-ca-server init`` command also generates a default configuration 424 file named **fabric-ca-server-config.yaml** in the server's home directory. 425 426 If you want the Fabric CA server to use a CA signing certificate and key file which you provide, 427 you must place your files in the location referenced by ``ca.certfile`` and ``ca.keyfile`` respectively. 428 Both files must be PEM-encoded and must not be encrypted. 429 More specifically, the contents of the CA certificate file must begin with ``-----BEGIN CERTIFICATE-----`` 430 and the contents of the key file must begin with ``-----BEGIN PRIVATE KEY-----`` and not 431 ``-----BEGIN ENCRYPTED PRIVATE KEY-----``. 432 433 Algorithms and key sizes 434 435 The CSR can be customized to generate X.509 certificates and keys that 436 support Elliptic Curve (ECDSA). The following setting is an 437 example of the implementation of Elliptic Curve Digital Signature 438 Algorithm (ECDSA) with curve ``prime256v1`` and signature algorithm 439 ``ecdsa-with-SHA256``: 440 441 .. code:: yaml 442 443 key: 444 algo: ecdsa 445 size: 256 446 447 The choice of algorithm and key size are based on security needs. 448 449 Elliptic Curve (ECDSA) offers the following key size options: 450 451 +--------+--------------+-----------------------+ 452 | size | ASN1 OID | Signature Algorithm | 453 +========+==============+=======================+ 454 | 256 | prime256v1 | ecdsa-with-SHA256 | 455 +--------+--------------+-----------------------+ 456 | 384 | secp384r1 | ecdsa-with-SHA384 | 457 +--------+--------------+-----------------------+ 458 | 521 | secp521r1 | ecdsa-with-SHA512 | 459 +--------+--------------+-----------------------+ 460 461 Starting the server 462 ~~~~~~~~~~~~~~~~~~~ 463 464 Start the Fabric CA server as follows: 465 466 .. code:: bash 467 468 fabric-ca-server start -b <admin>:<adminpw> 469 470 If the server has not been previously initialized, it will initialize 471 itself as it starts for the first time. During this initialization, the 472 server will generate the ca-cert.pem and ca-key.pem files if they don't 473 yet exist and will also create a default configuration file if it does 474 not exist. See the `Initialize the Fabric CA server <#initialize>`__ section. 475 476 Unless the Fabric CA server is configured to use LDAP, it must be 477 configured with at least one pre-registered bootstrap identity to enable you 478 to register and enroll other identities. The ``-b`` option specifies the 479 name and password for a bootstrap identity. 480 481 To cause the Fabric CA server to listen on ``https`` rather than 482 ``http``, set ``tls.enabled`` to ``true``. 483 484 SECURITY WARNING: The Fabric CA server should always be started with TLS 485 enabled (``tls.enabled`` set to true). Failure to do so leaves the 486 server vulnerable to an attacker with access to network traffic. 487 488 To limit the number of times that the same secret (or password) can be 489 used for enrollment, set the ``registry.maxenrollments`` in the configuration 490 file to the appropriate value. If you set the value to 1, the Fabric CA 491 server allows passwords to only be used once for a particular enrollment 492 ID. If you set the value to -1, the Fabric CA server places no limit on 493 the number of times that a secret can be reused for enrollment. The 494 default value is -1. Setting the value to 0, the Fabric CA server will 495 disable enrollment for all identities and registration of identities will 496 not be allowed. 497 498 The Fabric CA server should now be listening on port 7054. 499 500 You may skip to the `Fabric CA Client <#fabric-ca-client>`__ section if 501 you do not want to configure the Fabric CA server to run in a cluster or 502 to use LDAP. 503 504 Configuring the database 505 ~~~~~~~~~~~~~~~~~~~~~~~~ 506 507 This section describes how to configure the Fabric CA server to connect 508 to PostgreSQL or MySQL databases. The default database is SQLite and the 509 default database file is ``fabric-ca-server.db`` in the Fabric CA 510 server's home directory. 511 512 If you don't care about running the Fabric CA server in a cluster, you 513 may skip this section; otherwise, you must configure either PostgreSQL or 514 MySQL as described below. Fabric CA supports the following database 515 versions in a cluster setup: 516 517 - PostgreSQL: 9.5.5 or later 518 - MySQL: 5.7 or later 519 520 PostgreSQL 521 ^^^^^^^^^^ 522 523 The following sample may be added to the server's configuration file in 524 order to connect to a PostgreSQL database. Be sure to customize the 525 various values appropriately. There are limitations on what characters are allowed 526 in the database name. Please refer to the following Postgres documentation 527 for more information: https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS 528 529 .. code:: yaml 530 531 db: 532 type: postgres 533 datasource: host=localhost port=5432 user=Username password=Password dbname=fabric_ca sslmode=verify-full 534 535 Specifying *sslmode* configures the type of SSL authentication. Valid 536 values for sslmode are: 537 538 | 539 540 +----------------+----------------+ 541 | Mode | Description | 542 +================+================+ 543 | disable | No SSL | 544 +----------------+----------------+ 545 | require | Always SSL | 546 | | (skip | 547 | | verification) | 548 +----------------+----------------+ 549 | verify-ca | Always SSL | 550 | | (verify that | 551 | | the | 552 | | certificate | 553 | | presented by | 554 | | the server was | 555 | | signed by a | 556 | | trusted CA) | 557 +----------------+----------------+ 558 | verify-full | Same as | 559 | | verify-ca AND | 560 | | verify that | 561 | | the | 562 | | certificate | 563 | | presented by | 564 | | the server was | 565 | | signed by a | 566 | | trusted CA and | 567 | | the server | 568 | | hostname | 569 | | matches the | 570 | | one in the | 571 | | certificate | 572 +----------------+----------------+ 573 574 | 575 576 If you would like to use TLS, then the ``db.tls`` section in the Fabric CA server 577 configuration file must be specified. If SSL client authentication is enabled 578 on the PostgreSQL server, then the client certificate and key file must also be 579 specified in the ``db.tls.client`` section. The following is an example 580 of the ``db.tls`` section: 581 582 .. code:: yaml 583 584 db: 585 ... 586 tls: 587 enabled: true 588 certfiles: 589 - db-server-cert.pem 590 client: 591 certfile: db-client-cert.pem 592 keyfile: db-client-key.pem 593 594 | **certfiles** - A list of PEM-encoded trusted root certificate files. 595 | **certfile** and **keyfile** - PEM-encoded certificate and key files that are used by the Fabric CA server to communicate securely with the PostgreSQL server 596 597 PostgreSQL SSL Configuration 598 """"""""""""""""""""""""""""" 599 600 **Basic instructions for configuring SSL on the PostgreSQL server:** 601 602 1. In postgresql.conf, uncomment SSL and set to "on" (SSL=on) 603 604 2. Place certificate and key files in the PostgreSQL data directory. 605 606 Instructions for generating self-signed certificates for: 607 https://www.postgresql.org/docs/9.5/static/ssl-tcp.html 608 609 Note: Self-signed certificates are for testing purposes and should not 610 be used in a production environment 611 612 **PostgreSQL Server - Require Client Certificates** 613 614 1. Place certificates of the certificate authorities (CAs) you trust in the file root.crt in the PostgreSQL data directory 615 616 2. In postgresql.conf, set "ssl\_ca\_file" to point to the root cert of the client (CA cert) 617 618 3. Set the clientcert parameter to 1 on the appropriate hostssl line(s) in pg\_hba.conf. 619 620 For more details on configuring SSL on the PostgreSQL server, please refer 621 to the following PostgreSQL documentation: 622 https://www.postgresql.org/docs/9.4/static/libpq-ssl.html 623 624 MySQL 625 ^^^^^^^ 626 627 The following sample may be added to the Fabric CA server configuration file in 628 order to connect to a MySQL database. Be sure to customize the various 629 values appropriately. There are limitations on what characters are allowed 630 in the database name. Please refer to the following MySQL documentation 631 for more information: https://dev.mysql.com/doc/refman/5.7/en/identifiers.html 632 633 On MySQL 5.7.X, certain modes affect whether the server permits '0000-00-00' as a valid date. 634 It might be necessary to relax the modes that MySQL server uses. We want to allow 635 the server to be able to accept zero date values. 636 637 In my.cnf, find the configuration option *sql_mode* and remove *NO_ZERO_DATE* if present. 638 Restart MySQL server after making this change. 639 640 Please refer to the following MySQL documentation on different modes available 641 and select the appropriate settings for the specific version of MySQL that is 642 being used. 643 644 https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html 645 646 .. code:: yaml 647 648 db: 649 type: mysql 650 datasource: root:rootpw@tcp(localhost:3306)/fabric_ca?parseTime=true&tls=custom 651 652 If connecting over TLS to the MySQL server, the ``db.tls.client`` 653 section is also required as described in the **PostgreSQL** section above. 654 655 MySQL SSL Configuration 656 """""""""""""""""""""""" 657 658 **Basic instructions for configuring SSL on MySQL server:** 659 660 1. Open or create my.cnf file for the server. Add or uncomment the 661 lines below in the [mysqld] section. These should point to the key and 662 certificates for the server, and the root CA cert. 663 664 Instructions on creating server and client-side certficates: 665 http://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html 666 667 [mysqld] ssl-ca=ca-cert.pem ssl-cert=server-cert.pem ssl-key=server-key.pem 668 669 Can run the following query to confirm SSL has been enabled. 670 671 mysql> SHOW GLOBAL VARIABLES LIKE 'have\_%ssl'; 672 673 Should see: 674 675 +----------------+----------------+ 676 | Variable_name | Value | 677 +================+================+ 678 | have_openssl | YES | 679 +----------------+----------------+ 680 | have_ssl | YES | 681 +----------------+----------------+ 682 683 2. After the server-side SSL configuration is finished, the next step is 684 to create a user who has a privilege to access the MySQL server over 685 SSL. For that, log in to the MySQL server, and type: 686 687 mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'%' IDENTIFIED BY 688 'password' REQUIRE SSL; mysql> FLUSH PRIVILEGES; 689 690 If you want to give a specific IP address from which the user will 691 access the server change the '%' to the specific IP address. 692 693 **MySQL Server - Require Client Certificates** 694 695 Options for secure connections are similar to those used on the server side. 696 697 - ssl-ca identifies the Certificate Authority (CA) certificate. This 698 option, if used, must specify the same certificate used by the server. 699 - ssl-cert identifies MySQL server's certificate. 700 - ssl-key identifies MySQL server's private key. 701 702 Suppose that you want to connect using an account that has no special 703 encryption requirements or was created using a GRANT statement that 704 includes the REQUIRE SSL option. As a recommended set of 705 secure-connection options, start the MySQL server with at least 706 --ssl-cert and --ssl-key options. Then set the ``db.tls.certfiles`` property 707 in the server configuration file and start the Fabric CA server. 708 709 To require that a client certificate also be specified, create the 710 account using the REQUIRE X509 option. Then the client must also specify 711 proper client key and certificate files; otherwise, the MySQL server 712 will reject the connection. To specify client key and certificate files 713 for the Fabric CA server, set the ``db.tls.client.certfile``, 714 and ``db.tls.client.keyfile`` configuration properties. 715 716 Configuring LDAP 717 ~~~~~~~~~~~~~~~~ 718 719 The Fabric CA server can be configured to read from an LDAP server. 720 721 In particular, the Fabric CA server may connect to an LDAP server to do 722 the following: 723 724 - authenticate an identity prior to enrollment 725 - retrieve an identity's attribute values which are used for authorization. 726 727 Modify the LDAP section of the Fabric CA server's configuration file to configure the 728 server to connect to an LDAP server. 729 730 .. code:: yaml 731 732 ldap: 733 # Enables or disables the LDAP client (default: false) 734 enabled: false 735 # The URL of the LDAP server 736 url: <scheme>://<adminDN>:<adminPassword>@<host>:<port>/<base> 737 userfilter: <filter> 738 attribute: 739 # 'names' is an array of strings that identify the specific attributes 740 # which are requested from the LDAP server. 741 names: <LDAPAttrs> 742 # The 'converters' section is used to convert LDAP attribute values 743 # to fabric CA attribute values. 744 # 745 # For example, the following converts an LDAP 'uid' attribute 746 # whose value begins with 'revoker' to a fabric CA attribute 747 # named "hf.Revoker" with a value of "true" (because the expression 748 # evaluates to true). 749 # converters: 750 # - name: hf.Revoker 751 # value: attr("uid") =~ "revoker*" 752 # 753 # As another example, assume a user has an LDAP attribute named 754 # 'member' which has multiple values of "dn1", "dn2", and "dn3". 755 # Further assume the following configuration. 756 # converters: 757 # - name: myAttr 758 # value: map(attr("member"),"groups") 759 # maps: 760 # groups: 761 # - name: dn1 762 # value: client 763 # - name: dn2 764 # value: peer 765 # The value of the user's 'myAttr' attribute is then computed to be 766 # "client,peer,dn3". This is because the value of 'attr("member")' is 767 # "dn1,dn2,dn3", and the call to 'map' with a 2nd argument of 768 # "group" replaces "dn1" with "client" and "dn2" with "peer". 769 converters: 770 - name: <fcaAttrName> 771 value: <fcaExpr> 772 maps: 773 <mapName>: 774 - name: <from> 775 value: <to> 776 777 Where: 778 779 * ``scheme`` is one of *ldap* or *ldaps*; 780 * ``adminDN`` is the distinquished name of the admin user; 781 * ``pass`` is the password of the admin user; 782 * ``host`` is the hostname or IP address of the LDAP server; 783 * ``port`` is the optional port number, where default 389 for *ldap* 784 and 636 for *ldaps*; 785 * ``base`` is the optional root of the LDAP tree to use for searches; 786 * ``filter`` is a filter to use when searching to convert a login 787 user name to a distinguished name. For example, a value of 788 ``(uid=%s)`` searches for LDAP entries with the value of a ``uid`` 789 attribute whose value is the login user name. Similarly, 790 ``(email=%s)`` may be used to login with an email address. 791 * ``LDAPAttrs`` is an array of LDAP attribute names to request from the 792 LDAP server on a user's behalf; 793 * the attribute.converters section is used to convert LDAP attributes to fabric 794 CA attributes, where 795 * ``fcaAttrName`` is the name of a fabric CA attribute; 796 * ``fcaExpr`` is an expression whose evaluated value is assigned to the fabric CA attribute. 797 For example, suppose that <LDAPAttrs> is ["uid"], <fcaAttrName> is 'hf.Revoker', 798 and <fcaExpr> is 'attr("uid") =~ "revoker*"'. This means that an attribute 799 named "uid" is requested from the LDAP server on a user's behalf. The user is 800 then given a value of 'true' for the 'hf.Revoker' attribute if the value of 801 the user's 'uid' LDAP attribute begins with 'revoker'; otherwise, the user 802 is given a value of 'false' for the 'hf.Revoker' attribute. 803 * the attribute.maps section is used to map LDAP response values. The typical 804 use case is to map a distinguished name associated with an LDAP group to an 805 identity type. 806 807 The LDAP expression language uses the govaluate package as described at 808 https://github.com/Knetic/govaluate/blob/master/MANUAL.md. This defines 809 operators such as "=~" and literals such as "revoker*", which is a regular 810 expression. The LDAP-specific variables and functions which extend the 811 base govaluate language are as follows: 812 813 * ``DN`` is a variable equal to the user's distinguished name. 814 * ``affiliation`` is a variable equal to the user's affiliation. 815 * ``attr`` is a function which takes 1 or 2 arguments. The 1st argument 816 is an LDAP attribute name. The 2nd argument is a separator string which is 817 used to join multiple values into a single string; the default separator 818 string is ",". The ``attr`` function always returns a value of type 819 'string'. 820 * ``map`` is a function which takes 2 arguments. The 1st argument 821 is any string. The second argument is the name of a map which is used to 822 perform string substitution on the string from the 1st argument. 823 * ``if`` is a function which takes a 3 arguments where the first argument 824 must resolve to a boolean value. If it evaluates to true, the second 825 argument is returned; otherwise, the third argument is returned. 826 827 For example, the following expression evaluates to true if the user has 828 a distinguished name ending in "O=org1,C=US", or if the user has an affiliation 829 beginning with "org1.dept2." and also has the "admin" attribute of "true". 830 831 **DN =~ "*O=org1,C=US" || (affiliation =~ "org1.dept2.*" && attr('admin') = 'true')** 832 833 NOTE: Since the ``attr`` function always returns a value of type 'string', 834 numeric operators may not be used to construct expressions. 835 For example, the following is NOT a valid expression: 836 837 .. code:: yaml 838 839 value: attr("gidNumber) >= 10000 && attr("gidNumber) < 10006 840 841 Alternatively, a regular expression enclosed in quotes as shown below may be used 842 to return an equivalent result: 843 844 .. code:: yaml 845 846 value: attr("gidNumber") =~ "1000[0-5]$" || attr("mail") == "root@example.com" 847 848 The following is a sample configuration section for the default setting 849 for the OpenLDAP server whose Docker image is at 850 ``https://github.com/osixia/docker-openldap``. 851 852 .. code:: yaml 853 854 ldap: 855 enabled: true 856 url: ldap://cn=admin,dc=example,dc=org:admin@localhost:10389/dc=example,dc=org 857 userfilter: (uid=%s) 858 859 See ``FABRIC_CA/scripts/run-ldap-tests`` for a script which starts an 860 OpenLDAP Docker image, configures it, runs the LDAP tests in 861 ``FABRIC_CA/cli/server/ldap/ldap_test.go``, and stops the OpenLDAP 862 server. 863 864 When LDAP is configured, enrollment works as follows: 865 866 867 - The Fabric CA client or client SDK sends an enrollment request with a 868 basic authorization header. 869 - The Fabric CA server receives the enrollment request, decodes the 870 identity name and password in the authorization header, looks up the DN (Distinguished 871 Name) associated with the identity name using the "userfilter" from the 872 configuration file, and then attempts an LDAP bind with the identity's 873 password. If the LDAP bind is successful, the enrollment processing is 874 authorized and can proceed. 875 876 Setting up a cluster 877 ~~~~~~~~~~~~~~~~~~~~ 878 879 You may use any IP sprayer to load balance to a cluster of Fabric CA 880 servers. This section provides an example of how to set up Haproxy to 881 route to a Fabric CA server cluster. Be sure to change hostname and port 882 to reflect the settings of your Fabric CA servers. 883 884 haproxy.conf 885 886 .. code:: 887 888 global 889 maxconn 4096 890 daemon 891 892 defaults 893 mode http 894 maxconn 2000 895 timeout connect 5000 896 timeout client 50000 897 timeout server 50000 898 899 listen http-in 900 bind *:7054 901 balance roundrobin 902 server server1 hostname1:port 903 server server2 hostname2:port 904 server server3 hostname3:port 905 906 907 Note: If using TLS, need to use ``mode tcp``. 908 909 Setting up multiple CAs 910 ~~~~~~~~~~~~~~~~~~~~~~~ 911 912 The fabric-ca server by default consists of a single default CA. However, additional CAs 913 can be added to a single server by using `cafiles` or `cacount` configuration options. 914 Each additional CA will have its own home directory. 915 916 cacount: 917 ^^^^^^^^ 918 919 The `cacount` provides a quick way to start X number of default additional 920 CAs. The home directory will be relative to the server directory. With this option, 921 the directory structure will be as follows: 922 923 .. code:: yaml 924 925 --<Server Home> 926 |--ca 927 |--ca1 928 |--ca2 929 930 Each additional CA will get a default configuration file generated in it's home 931 directory, within the configuration file it will contain a unique CA name. 932 933 For example, the following command will start 2 default CA instances: 934 935 .. code:: bash 936 937 fabric-ca-server start -b admin:adminpw --cacount 2 938 939 cafiles: 940 ^^^^^^^^ 941 942 If absolute paths are not provided when using the cafiles configuration option, 943 the CA home directory will be relative to the server directory. 944 945 To use this option, CA configuration files must have already been generated and 946 configured for each CA that is to be started. Each configuration file must have 947 a unique CA name and Common Name (CN), otherwise the server will fail to start as these 948 names must be unique. The CA configuration files will override any default 949 CA configuration, and any missing options in the CA configuration files will be 950 replaced by the values from the default CA. 951 952 The precedence order will be as follows: 953 954 1. CA Configuration file 955 2. Default CA CLI flags 956 3. Default CA Environment variables 957 4. Default CA Configuration file 958 959 A CA configuration file must contain at least the following: 960 961 .. code:: yaml 962 963 ca: 964 # Name of this CA 965 name: <CANAME> 966 967 csr: 968 cn: <COMMONNAME> 969 970 You may configure your directory structure as follows: 971 972 .. code:: yaml 973 974 --<Server Home> 975 |--ca 976 |--ca1 977 |-- fabric-ca-config.yaml 978 |--ca2 979 |-- fabric-ca-config.yaml 980 981 For example, the following command will start two customized CA instances: 982 983 .. code:: bash 984 985 fabric-ca-server start -b admin:adminpw --cafiles ca/ca1/fabric-ca-config.yaml 986 --cafiles ca/ca2/fabric-ca-config.yaml 987 988 989 Enrolling an intermediate CA 990 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 991 992 In order to create a CA signing certificate for an intermediate CA, the intermediate 993 CA must enroll with a parent CA in the same way that a fabric-ca-client enrolls with a CA. 994 This is done by using the -u option to specify the URL of the parent CA and the enrollment ID 995 and secret as shown below. The identity associated with this enrollment ID must have an 996 attribute with a name of "hf.IntermediateCA" and a value of "true". The CN (or Common Name) 997 of the issued certificate will be set to the enrollment ID. An error will occur if an intermediate 998 CA tries to explicitly specify a CN value. 999 1000 .. code:: bash 1001 1002 fabric-ca-server start -b admin:adminpw -u http://<enrollmentID>:<secret>@<parentserver>:<parentport> 1003 1004 For other intermediate CA flags see `Fabric CA server's configuration file format`_ section. 1005 1006 1007 Upgrading the server 1008 ~~~~~~~~~~~~~~~~~~~~ 1009 1010 The Fabric CA server must be upgraded before upgrading the Fabric CA client. 1011 Prior to upgrade, it is suggested that the current database be backed up: 1012 1013 - If using sqlite3, backup the current database file (which is named fabric-ca-server.db by default). 1014 - For other database types, use the appropriate backup/replication mechanism. 1015 1016 To upgrade a single instance of Fabric CA server: 1017 1018 1. Stop the fabric-ca-server process. 1019 2. Ensure the current database is backed up. 1020 3. Replace previous fabric-ca-server binary with the upgraded version. 1021 4. Launch the fabric-ca-server process. 1022 5. Verify the fabric-ca-server process is available with the following 1023 command where <host> is the hostname on which the server was started:: 1024 1025 fabric-ca-client getcainfo -u http://<host>:7054 1026 1027 Upgrading a cluster: 1028 ^^^^^^^^^^^^^^^^^^^^ 1029 To upgrade a cluster of fabric-ca-server instances using either a MySQL or Postgres database, perform the following procedure. We assume that you are using haproxy to load balance to two fabric-ca-server cluster members on host1 and host2, respectively, both listening on port 7054. After this procedure, you will be load balancing to upgraded fabric-ca-server cluster members on host3 and host4 respectively, both listening on port 7054. 1030 1031 In order to monitor the changes using haproxy stats, enable statistics collection. Add the following lines to the global section of the haproxy configuration file: 1032 1033 :: 1034 1035 stats socket /var/run/haproxy.sock mode 666 level operator 1036 stats timeout 2m 1037 1038 Restart haproxy to pick up the changes:: 1039 1040 # haproxy -f <configfile> -st $(pgrep haproxy) 1041 1042 To display summary information from the haproxy "show stat" command, the following function may prove useful for parsing the copious amount of CSV data returned: 1043 1044 .. code:: bash 1045 1046 haProxyShowStats() { 1047 echo "show stat" | nc -U /var/run/haproxy.sock |sed '1s/^# *//'| 1048 awk -F',' -v fmt="%4s %12s %10s %6s %6s %4s %4s\n" ' 1049 { if (NR==1) for (i=1;i<=NF;i++) f[tolower($i)]=i } 1050 { printf fmt, $f["sid"],$f["pxname"],$f["svname"],$f["status"], 1051 $f["weight"],$f["act"],$f["bck"] }' 1052 } 1053 1054 1055 1) Initially your haproxy configuration file is similar to the following:: 1056 1057 server server1 host1:7054 check 1058 server server2 host2:7054 check 1059 1060 Change this configuration to the following:: 1061 1062 server server1 host1:7054 check backup 1063 server server2 host2:7054 check backup 1064 server server3 host3:7054 check 1065 server server4 host4:7054 check 1066 1067 2) Restart the HA proxy with the new configuration as follows:: 1068 1069 haproxy -f <configfile> -st $(pgrep haproxy) 1070 1071 ``"haProxyShowStats"`` will now reflect the modified configuration, 1072 with two active, older-version backup servers and two (yet to be started) upgraded servers:: 1073 1074 sid pxname svname status weig act bck 1075 1 fabric-cas server3 DOWN 1 1 0 1076 2 fabric-cas server4 DOWN 1 1 0 1077 3 fabric-cas server1 UP 1 0 1 1078 4 fabric-cas server2 UP 1 0 1 1079 1080 3) Install upgraded binaries of fabric-ca-server on host3 and host4. The new 1081 upgraded servers on host3 and host4 should be configured to use the same 1082 database as their older counterparts on host1 and host2. After starting 1083 the upgraded servers, the database will be automatically migrated. The 1084 haproxy will forward all new traffic to the upgraded servers, since they 1085 are not configured as backup servers. Verify using the ``"fabric-ca-client getcainfo"`` 1086 command that your cluster is still functioning appropriately before proceeding. 1087 Also, ``"haProxyShowStats"`` should now reflect that all servers are active, 1088 similar to the following:: 1089 1090 sid pxname svname status weig act bck 1091 1 fabric-cas server3 UP 1 1 0 1092 2 fabric-cas server4 UP 1 1 0 1093 3 fabric-cas server1 UP 1 0 1 1094 4 fabric-cas server2 UP 1 0 1 1095 1096 4) Stop the old servers on host1 and host2. Verify using the 1097 ``"fabric-ca-client getcainfo"`` command that your new cluster is still 1098 functioning appropriately before proceeding. Then remove the older 1099 server backup configuration from the haproxy configuration file, 1100 so that it looks similar to the following:: 1101 1102 server server3 host3:7054 check 1103 server server4 host4:7054 check 1104 1105 5) Restart the HA proxy with the new configuration as follows:: 1106 1107 haproxy -f <configfile> -st $(pgrep haproxy) 1108 1109 ``"haProxyShowStats"`` will now reflect the modified configuration, 1110 with two active servers which have been upgraded to the new version:: 1111 1112 sid pxname svname status weig act bck 1113 1 fabric-cas server3 UP 1 1 0 1114 2 fabric-cas server4 UP 1 1 0 1115 1116 1117 `Back to Top`_ 1118 1119 1120 Operations Service 1121 ~~~~~~~~~~~~~~~~~~~~ 1122 1123 The CA Server hosts an HTTP server that offers a RESTful “operations” API. This API 1124 is intended to be used by operators, not administrators or “users” of the network. 1125 1126 The API exposes the following capabilities: 1127 1128 Prometheus target for operational metrics (when configured) 1129 1130 Configuring the Operations Service 1131 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1132 1133 The operations service requires two basic pieces of configuration: 1134 1135 The **address** and **port** to listen on. 1136 The **TLS certificates** and **keys** to use for authentication and encryption. Note, **these 1137 certificates should be generated by a separate and dedicated CA**. Do not use a CA that 1138 has generated certificates for any organizations in any channels. 1139 1140 The CA server can be configurated in the ``operations`` section of server's configuration file: 1141 1142 .. code:: yaml 1143 1144 operations: 1145 # host and port for the operations server 1146 listenAddress: 127.0.0.1:9443 1147 1148 # TLS configuration for the operations endpoint 1149 tls: 1150 # TLS enabled 1151 enabled: true 1152 1153 # path to PEM encoded server certificate for the operations server 1154 cert: 1155 file: tls/server.crt 1156 1157 # path to PEM encoded server key for the operations server 1158 key: 1159 file: tls/server.key 1160 1161 # require client certificate authentication to access all resources 1162 clientAuthRequired: false 1163 1164 # paths to PEM encoded ca certificates to trust for client authentication 1165 clientRootCAs: 1166 files: [] 1167 1168 The ``listenAddress`` key defines the host and port that the operation server 1169 will listen on. If the server should listen on all addresses, the host portion 1170 can be omitted. 1171 1172 The ``tls`` section is used to indicate whether or not TLS is enabled for the 1173 operations service, the location of the service's certificate and private key, 1174 and the locations of certificate authority root certificates that should be 1175 trusted for client authentication. When ``clientAuthRequired`` is ``true``, 1176 clients will be required to provide a certificate for authentication. 1177 1178 Operations Security 1179 ^^^^^^^^^^^^^^^^^^^^^^ 1180 1181 As the operations service is focused on operations and intentionally unrelated 1182 to the Fabric network, it does not use the Membership Services Provider for 1183 access control. Instead, the operations service relies entirely on mutual TLS with 1184 client certificate authentication. 1185 1186 It is highly recommended to enable mutual TLS by setting the value of ``clientAuthRequired`` 1187 to ``true`` in production environments. With this configuration, clients are 1188 required to provide a valid certificate for authentication. If the client does 1189 not provide a certificate or the service cannot verify the client’s certificate, 1190 the request is rejected. Note that if ``clientAuthRequired`` is set to ``false``, 1191 clients do not need to provide a certificate; if they do, however, and the service 1192 cannot verify the certificate, then the request will be rejected. 1193 1194 When TLS is disabled, authorization is bypassed and any client that can 1195 connect to the operations endpoint will be able to use the API. 1196 1197 Metrics 1198 ^^^^^^^^^ 1199 1200 The Fabric CA exposes metrics that can provide insight into the behavior of the system. 1201 Operators and administrators can use this information to better understand how the system 1202 is performing over time. 1203 1204 Configuring Metrics 1205 ^^^^^^^^^^^^^^^^^^^^ 1206 1207 Fabric CA provides two ways to expose metrics: a **pull** model based on Prometheus 1208 and a **push** model based on StatsD. 1209 1210 Prometheus 1211 ^^^^^^^^^^^ 1212 1213 A typical Prometheus deployment scrapes metrics by requesting them from an HTTP 1214 endpoint exposed by instrumented targets. As Prometheus is responsible for 1215 requesting the metrics, it is considered a pull system. 1216 1217 When configured, a Fabric CA Server will present a ``/metrics`` resource 1218 on the operations service. To enable Prometheus, set the provider value in the 1219 server's configuration file to ``prometheus``. 1220 1221 .. code:: yaml 1222 1223 metrics: 1224 provider: prometheus 1225 1226 StatsD 1227 ^^^^^^^ 1228 1229 StatsD is a simple statistics aggregation daemon. Metrics are sent to a 1230 ``statsd`` daemon where they are collected, aggregated, and pushed to a backend 1231 for visualization and alerting. As this model requires instrumented processes 1232 to send metrics data to StatsD, this is considered a push system. 1233 1234 The CA Server can be configured to send metrics to StatsD by setting the metrics 1235 provider to ``statsd`` in the ``metrics`` section in servers' configuration filel. The ``statsd`` 1236 subsection must also be configured with the address of the StatsD daemon, the 1237 network type to use (``tcp`` or ``udp``), and how often to send the metrics. An 1238 optional ``prefix`` may be specified to help differentiate the source of the 1239 metrics --- for example, differentiating metrics coming from separate servers --- 1240 that would be prepended to all generated metrics. 1241 1242 .. code:: yaml 1243 1244 metrics: 1245 provider: statsd 1246 statsd: 1247 network: udp 1248 address: 127.0.0.1:8125 1249 writeInterval: 10s 1250 prefix: server-0 1251 1252 For a look at the different metrics that are generated, check out 1253 :doc:`metrics_reference`. 1254 1255 `Back to Top`_ 1256 1257 .. _client: 1258 1259 Fabric CA Client 1260 ---------------- 1261 1262 This section describes how to use the fabric-ca-client command. 1263 1264 The Fabric CA client's home directory is determined as follows: 1265 - if the --home command line option is set, use its value 1266 - otherwise, if the ``FABRIC_CA_CLIENT_HOME`` environment variable is set, use 1267 its value 1268 - otherwise, if the ``FABRIC_CA_HOME`` environment variable is set, 1269 use its value 1270 - otherwise, if the ``CA_CFG_PATH`` environment variable is set, use 1271 its value 1272 - otherwise, use ``$HOME/.fabric-ca-client`` 1273 1274 The instructions below assume that the client configuration file exists 1275 in the client's home directory. 1276 1277 Enrolling the bootstrap identity 1278 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 1280 First, if needed, customize the CSR (Certificate Signing Request) section 1281 in the client configuration file. Note that ``csr.cn`` field must be set 1282 to the ID of the bootstrap identity. Default CSR values are shown below: 1283 1284 .. code:: yaml 1285 1286 csr: 1287 cn: <<enrollment ID>> 1288 key: 1289 algo: ecdsa 1290 size: 256 1291 names: 1292 - C: US 1293 ST: North Carolina 1294 L: 1295 O: Hyperledger Fabric 1296 OU: Fabric CA 1297 hosts: 1298 - <<hostname of the fabric-ca-client>> 1299 ca: 1300 pathlen: 1301 pathlenzero: 1302 expiry: 1303 1304 See `CSR fields <#csr-fields>`__ for description of the fields. 1305 1306 Then run ``fabric-ca-client enroll`` command to enroll the identity. For example, 1307 following command enrolls an identity whose ID is **admin** and password is **adminpw** 1308 by calling Fabric CA server that is running locally at 7054 port. 1309 1310 .. code:: bash 1311 1312 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1313 fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 1314 1315 The enroll command stores an enrollment certificate (ECert), corresponding private key and CA 1316 certificate chain PEM files in the subdirectories of the Fabric CA client's ``msp`` directory. 1317 You will see messages indicating where the PEM files are stored. 1318 1319 Registering a new identity 1320 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1321 1322 The identity performing the register request must be currently enrolled, and 1323 must also have the proper authority to register the type of the identity that is being 1324 registered. 1325 1326 In particular, three authorization checks are made by the Fabric CA server 1327 during registration as follows: 1328 1329 1. The registrar (i.e. the invoker) must have the "hf.Registrar.Roles" attribute with a 1330 comma-separated list of values where one of the values equals the type of 1331 identity being registered; for example, if the registrar has the 1332 "hf.Registrar.Roles" attribute with a value of "peer", the registrar 1333 can register identities of type peer, but not client, admin, or orderer. 1334 1335 2. The affiliation of the registrar must be equal to or a prefix of 1336 the affiliation of the identity being registered. For example, an registrar 1337 with an affiliation of "a.b" may register an identity with an affiliation 1338 of "a.b.c" but may not register an identity with an affiliation of "a.c". 1339 If root affiliation is required for an identity, then the affiliation request 1340 should be a dot (".") and the registrar must also have root affiliation. 1341 If no affiliation is specified in the registration request, the identity being 1342 registered will be given the affiliation of the registrar. 1343 1344 3. The registrar can register an identity with attributes if all of the following conditions 1345 are satisfied: 1346 1347 - Registrar can register Fabric CA reserved attributes that have the prefix 'hf.' 1348 only if the registrar possesses the attribute and it is part of the value of the 1349 hf.Registrar.Attributes' attribute. Furthermore, if the attribute is of type list 1350 then the value of attribute being registered must be equal to or a subset of the 1351 value that the registrar has. If the attribute is of type boolean, the registrar 1352 can register the attribute only if the registrar's value for the attribute is 'true'. 1353 - Registering custom attributes (i.e. any attribute whose name does not begin with 'hf.') 1354 requires that the registrar has the 'hf.Registar.Attributes' attribute with the value of 1355 the attribute or pattern being registered. The only supported pattern is a string with 1356 a "*" at the end. For example, "a.b.*" is a pattern which matches all attribute names 1357 beginning with "a.b.". For example, if the registrar has hf.Registrar.Attributes=orgAdmin, 1358 then the only attribute which the registrar can add or remove from an identity is the 1359 'orgAdmin' attribute. 1360 - If the requested attribute name is 'hf.Registrar.Attributes', an additional 1361 check is performed to see if the requested values for this attribute are equal 1362 to or a subset of the registrar's values for 'hf.Registrar.Attributes'. For this 1363 to be true, each requested value must match a value in the registrar's value for 1364 'hf.Registrar.Attributes' attribute. For example, if the registrar's value for 1365 'hf.Registrar.Attributes' is 'a.b.*, x.y.z' and the requested attribute 1366 value is 'a.b.c, x.y.z', it is valid because 'a.b.c' matches 'a.b.*' and 'x.y.z' 1367 matches the registrar's 'x.y.z' value. 1368 1369 Examples: 1370 Valid Scenarios: 1371 1. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1372 is registering attribute 'a.b.c', it is valid 'a.b.c' matches 'a.b.*'. 1373 2. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1374 is registering attribute 'x.y.z', it is valid because 'x.y.z' matches the registrar's 1375 'x.y.z' value. 1376 3. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1377 the requested attribute value is 'a.b.c, x.y.z', it is valid because 'a.b.c' matches 1378 'a.b.*' and 'x.y.z' matches the registrar's 'x.y.z' value. 1379 4. If the registrar has the attribute 'hf.Registrar.Roles = peer,client,admin,orderer' and 1380 the requested attribute value is 'peer', 'peer,client,admin,orderer', or 'client,admin', 1381 it is valid because the requested value is equal to or a subset of the registrar's value. 1382 1383 Invalid Scenarios: 1384 1. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1385 is registering attribute 'hf.Registar.Attributes = a.b.c, x.y.*', it is invalid 1386 because requested attribute 'x.y.*' is not a pattern owned by the registrar. The value 1387 'x.y.*' is a superset of 'x.y.z'. 1388 2. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1389 is registering attribute 'hf.Registar.Attributes = a.b.c, x.y.z, attr1', it is invalid 1390 because the registrar's 'hf.Registrar.Attributes' attribute values do not contain 'attr1'. 1391 3. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1392 is registering attribute 'a.b', it is invalid because the value 'a.b' is not contained in 1393 'a.b.*'. 1394 4. If the registrar has the attribute 'hf.Registrar.Attributes = a.b.*, x.y.z' and 1395 is registering attribute 'x.y', it is invalid because 'x.y' is not contained by 'x.y.z'. 1396 5. If the registrar has the attribute 'hf.Registrar.Roles = peer' and 1397 the requested attribute value is 'peer,client', it is invalid because 1398 the registrar does not have the client role in its value of hf.Registrar.Roles 1399 attribute. 1400 6. If the registrar has the attribute 'hf.Revoker = false' and the requested attribute 1401 value is 'true', it is invalid because the hf.Revoker attribute is a boolean attribute 1402 and the registrar's value for the attribute is not 'true'. 1403 1404 The table below lists all the attributes that can be registered for an identity. 1405 The names of attributes are case sensitive. 1406 1407 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1408 | Name | Type | Description | 1409 +=============================+============+============================================================================================================+ 1410 | hf.Registrar.Roles | List | List of roles that the registrar is allowed to manage | 1411 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1412 | hf.Registrar.DelegateRoles | List | List of roles that the registrar is allowed to give to a registree for its 'hf.Registrar.Roles' attribute | 1413 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1414 | hf.Registrar.Attributes | List | List of attributes that registrar is allowed to register | 1415 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1416 | hf.GenCRL | Boolean | Identity is able to generate CRL if attribute value is true | 1417 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1418 | hf.Revoker | Boolean | Identity is able to revoke an identity and/or certificates if attribute value is true | 1419 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1420 | hf.AffiliationMgr | Boolean | Identity is able to manage affiliations if attribute value is true | 1421 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1422 | hf.IntermediateCA | Boolean | Identity is able to enroll as an intermediate CA if attribute value is true | 1423 +-----------------------------+------------+------------------------------------------------------------------------------------------------------------+ 1424 1425 Note: When registering an identity, you specify an array of attribute names and values. If the array 1426 specifies multiple array elements with the same name, only the last element is currently used. In other words, 1427 multi-valued attributes are not currently supported. 1428 1429 The following command uses the **admin** identity's credentials to register a new 1430 identity with an enrollment id of "admin2", an affiliation of 1431 "org1.department1", an attribute named "hf.Revoker" with a value of "true", and 1432 an attribute named "admin" with a value of "true". The ":ecert" suffix means that 1433 by default the "admin" attribute and its value will be inserted into the identity's 1434 enrollment certificate, which can then be used to make access control decisions. 1435 1436 .. code:: bash 1437 1438 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1439 fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert' 1440 1441 The password, also known as the enrollment secret, is printed. 1442 This password is required to enroll the identity. 1443 This allows an administrator to register an identity and give the 1444 enrollment ID and the secret to someone else to enroll the identity. 1445 1446 Multiple attributes can be specified as part of the --id.attrs flag, each 1447 attribute must be comma separated. For an attribute value that contains a comma, 1448 the attribute must be encapsulated in double quotes. See example below. 1449 1450 .. code:: bash 1451 1452 fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,client",hf.Revoker=true' 1453 1454 or 1455 1456 .. code:: bash 1457 1458 fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,client"' --id.attrs hf.Revoker=true 1459 1460 You may set default values for any of the fields used in the register command 1461 by editing the client's configuration file. For example, suppose the configuration 1462 file contains the following: 1463 1464 .. code:: yaml 1465 1466 id: 1467 name: 1468 type: client 1469 affiliation: org1.department1 1470 maxenrollments: -1 1471 attributes: 1472 - name: hf.Revoker 1473 value: true 1474 - name: anotherAttrName 1475 value: anotherAttrValue 1476 1477 The following command would then register a new identity with an enrollment id of 1478 "admin3" which it takes from the command line, and the remainder is taken from the 1479 configuration file including the identity type: "client", affiliation: "org1.department1", 1480 and two attributes: "hf.Revoker" and "anotherAttrName". 1481 1482 .. code:: bash 1483 1484 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1485 fabric-ca-client register --id.name admin3 1486 1487 To register an identity with multiple attributes requires specifying all attribute names and values 1488 in the configuration file as shown above. 1489 1490 Setting `maxenrollments` to 0 or leaving it out from the configuration will result in the identity 1491 being registered to use the CA's max enrollment value. Furthermore, the max enrollment value for 1492 an identity being registered cannot exceed the CA's max enrollment value. For example, if the CA's 1493 max enrollment value is 5. Any new identity must have a value less than or equal to 5, and also 1494 can't set it to -1 (infinite enrollments). 1495 1496 Next, let's register a peer identity which will be used to enroll the peer in the following section. 1497 The following command registers the **peer1** identity. Note that we choose to specify our own 1498 password (or secret) rather than letting the server generate one for us. 1499 1500 .. code:: bash 1501 1502 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1503 fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw 1504 1505 Note that affiliations are case sensitive except for the non-leaf affiliations that are specified in 1506 the server configuration file, which are always stored in lower case. For example, if the affiliations 1507 section of the server configuration file looks like this: 1508 1509 .. code:: bash 1510 1511 affiliations: 1512 BU1: 1513 Department1: 1514 - Team1 1515 BU2: 1516 - Department2 1517 - Department3 1518 1519 `BU1`, `Department1`, `BU2` are stored in lower case. This is because Fabric CA uses Viper to read configuration. 1520 Viper treats map keys as case insensitive and always returns lowercase value. To register an identity with 1521 `Team1` affiliation, `bu1.department1.Team1` would need to be specified to the 1522 `--id.affiliation` flag as shown below: 1523 1524 .. code:: bash 1525 1526 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1527 fabric-ca-client register --id.name client1 --id.type client --id.affiliation bu1.department1.Team1 1528 1529 Enrolling a peer identity 1530 ~~~~~~~~~~~~~~~~~~~~~~~~~ 1531 1532 Now that you have successfully registered a peer identity, you may now 1533 enroll the peer given the enrollment ID and secret (i.e. the *password* 1534 from the previous section). This is similar to enrolling the bootstrap identity 1535 except that we also demonstrate how to use the "-M" option to populate the 1536 Hyperledger Fabric MSP (Membership Service Provider) directory structure. 1537 1538 The following command enrolls peer1. 1539 Be sure to replace the value of the "-M" option with the path to your 1540 peer's MSP directory which is the 1541 'mspConfigPath' setting in the peer's core.yaml file. 1542 You may also set the FABRIC_CA_CLIENT_HOME to the home directory of your peer. 1543 1544 .. code:: bash 1545 1546 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1 1547 fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp 1548 1549 Enrolling an orderer is the same, except the path to the MSP directory is 1550 the 'LocalMSPDir' setting in your orderer's orderer.yaml file. 1551 1552 All enrollment certificates issued by the fabric-ca-server have organizational 1553 units (or "OUs" for short) as follows: 1554 1555 1. The root of the OU hierarchy equals the identity type 1556 2. An OU is added for each component of the identity's affiliation 1557 1558 For example, if an identity is of type `peer` and its affiliation is 1559 `department1.team1`, the identity's OU hierarchy (from leaf to root) is 1560 `OU=team1, OU=department1, OU=peer`. 1561 1562 Getting Identity Mixer credential 1563 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1564 Identity Mixer (Idemix) is a cryptographic protocol suite for privacy-preserving authentication and transfer of certified attributes. 1565 Idemix allows clients to authenticate with verifiers without the involvement of the issuer (CA) and selectively disclose only those attributes 1566 that are required by the verifier and can do so without being linkable across their transactions. 1567 1568 Fabric CA server can issue Idemix credentials in addition to X509 certificates. An Idemix credential can be requested by sending the request to 1569 the ``/api/v1/idemix/credential`` API endpoint. For more information on this and other Fabric CA server API endpoints, please refer to 1570 `swagger-fabric-ca.json <https://github.com/hyperledger/fabric-ca/blob/master/swagger/swagger-fabric-ca.json>`_. 1571 1572 The Idemix credential issuance is a two step process. First, send a request with an empty body to the ``/api/v1/idemix/credential`` 1573 API endpoint to get a nonce and CA's Idemix public key. Second, create a credential request using the nonce and CA's Idemix public key and 1574 send another request with the credential request in the body to the ``/api/v1/idemix/credential`` API endpoint to get an Idemix credential, 1575 Credential Revocation Information (CRI), and attribute names and values. Currently, only three attributes are supported: 1576 1577 - **OU** - organization unit of the identity. The value of this attribute is set to identity's affiliation. For example, if identity's affiliation is `dept1.unit1`, then OU attribute is set to `dept1.unit1` 1578 - **IsAdmin** - if the identity is an admin or not. The value of this attribute is set to the value of `isAdmin` registration attribute. 1579 - **EnrollmentID** - enrollment ID of the identity 1580 1581 You can refer to the `handleIdemixEnroll` function in https://github.com/hyperledger/fabric-ca/blob/master/lib/client.go for reference implementation 1582 of the two step process for getting Idemix credential. 1583 1584 The ``/api/v1/idemix/credential`` API endpoint accepts both basic and token authorization headers. The basic authorization header should 1585 contain User's registration ID and password. If the identity already has X509 enrollment certificate, it can also be used to create a token authorization header. 1586 1587 Note that Hyperledger Fabric will support clients to sign transactions with both X509 and Idemix credentials, but will only support X509 credentials 1588 for peer and orderer identities. As before, applications can use a Fabric SDK to send requests to the Fabric CA server. SDKs hide the complexity 1589 associated with creating authorization header and request payload, and with processing the response. 1590 1591 Getting Idemix CRI (Certificate Revocation Information) 1592 ------------------------------------------------------- 1593 An Idemix CRI (Credential Revocation Information) is similar in purpose to an X509 CRL (Certificate Revocation List): 1594 to revoke what was previously issued. However, there are some differences. 1595 1596 In X509, the issuer revokes an end user's certificate and its ID is included in the CRL. 1597 The verifier checks to see if the user's certificate is in the CRL and if so, returns an authorization failure. 1598 The end user is not involved in this revocation process, other than receiving an authorization error from a verifier. 1599 1600 In Idemix, the end user is involved. The issuer revokes an end user's credential similar to X509 and evidence of this 1601 revocation is recorded in the CRI. The CRI is given to the end user (aka "prover"). The end user then generates a 1602 proof that their credential has not been revoked according to the CRI. The end user gives this proof to the verifier 1603 who verifies the proof according to the CRI. 1604 For verification to succeed, the version of the CRI (known as the "epoch") used by the end user and verifier must be same. 1605 The latest CRI can be requested by sending a request to ``/api/v1/idemix/cri`` API endpoint. 1606 1607 The version of the CRI is incremented when an enroll request is received by the fabric-ca-server and there are no revocation 1608 handles remaining in the revocation handle pool. In this case, the fabric-ca-server must generate a new pool of revocation 1609 handles which increments the epoch of the CRI. The number of revocation handles in the revocation handle pool is configurable 1610 via the ``idemix.rhpoolsize`` server configuration property. 1611 1612 Reenrolling an identity 1613 ~~~~~~~~~~~~~~~~~~~~~~~ 1614 1615 Suppose your enrollment certificate is about to expire or has been compromised. 1616 You can issue the reenroll command to renew your enrollment certificate as follows. 1617 1618 .. code:: bash 1619 1620 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1 1621 fabric-ca-client reenroll 1622 1623 Revoking a certificate or identity 1624 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1625 An identity or a certificate can be revoked. Revoking an identity will revoke all 1626 the certificates owned by the identity and will also prevent the identity from getting 1627 any new certificates. Revoking a certificate will invalidate a single certificate. 1628 1629 In order to revoke a certificate or an identity, the calling identity must have 1630 the ``hf.Revoker`` and ``hf.Registrar.Roles`` attribute. The revoking identity 1631 can only revoke a certificate or an identity that has an affiliation that is 1632 equal to or prefixed by the revoking identity's affiliation. Furthermore, the 1633 revoker can only revoke identities with types that are listed in the revoker's 1634 ``hf.Registrar.Roles`` attribute. 1635 1636 For example, a revoker with affiliation **orgs.org1** and 'hf.Registrar.Roles=peer,client' 1637 attribute can revoke either a **peer** or **client** type identity affiliated with 1638 **orgs.org1** or **orgs.org1.department1** but can't revoke an identity affiliated with 1639 **orgs.org2** or of any other type. 1640 1641 The following command disables an identity and revokes all of the certificates 1642 associated with the identity. All future requests received by the Fabric CA server 1643 from this identity will be rejected. 1644 1645 .. code:: bash 1646 1647 fabric-ca-client revoke -e <enrollment_id> -r <reason> 1648 1649 The following are the supported reasons that can be specified using ``-r`` flag: 1650 1651 1. unspecified 1652 2. keycompromise 1653 3. cacompromise 1654 4. affiliationchange 1655 5. superseded 1656 6. cessationofoperation 1657 7. certificatehold 1658 8. removefromcrl 1659 9. privilegewithdrawn 1660 10. aacompromise 1661 1662 For example, the bootstrap admin who is associated with root of the affiliation tree 1663 can revoke **peer1**'s identity as follows: 1664 1665 .. code:: bash 1666 1667 export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin 1668 fabric-ca-client revoke -e peer1 1669 1670 An enrollment certificate that belongs to an identity can be revoked by 1671 specifying its AKI (Authority Key Identifier) and serial number as follows: 1672 1673 .. code:: bash 1674 1675 fabric-ca-client revoke -a xxx -s yyy -r <reason> 1676 1677 For example, you can get the AKI and the serial number of a certificate using the openssl command 1678 and pass them to the ``revoke`` command to revoke the said certificate as follows: 1679 1680 .. code:: bash 1681 1682 serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2) 1683 aki=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}') 1684 fabric-ca-client revoke -s $serial -a $aki -r affiliationchange 1685 1686 The `--gencrl` flag can be used to generate a CRL (Certificate Revocation List) that contains all the revoked 1687 certificates. For example, following command will revoke the identity **peer1**, generates a CRL and stores 1688 it in the **<msp folder>/crls/crl.pem** file. 1689 1690 .. code:: bash 1691 1692 fabric-ca-client revoke -e peer1 --gencrl 1693 1694 A CRL can also be generated using the `gencrl` command. Refer to the `Generating a CRL (Certificate Revocation List)`_ 1695 section for more information on the `gencrl` command. 1696 1697 Generating a CRL (Certificate Revocation List) 1698 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 After a certificate is revoked in the Fabric CA server, the appropriate MSPs in Hyperledger Fabric must also be updated. 1700 This includes both local MSPs of the peers as well as MSPs in the appropriate channel configuration blocks. 1701 To do this, PEM encoded CRL (certificate revocation list) file must be placed in the `crls` 1702 folder of the MSP. The ``fabric-ca-client gencrl`` command can be used to generate a CRL. Any identity 1703 with ``hf.GenCRL`` attribute can create a CRL that contains serial numbers of all certificates that were revoked 1704 during a certain period. The created CRL is stored in the `<msp folder>/crls/crl.pem` file. 1705 1706 The following command will create a CRL containing all the revoked certficates (expired and unexpired) and 1707 store the CRL in the `~/msp/crls/crl.pem` file. 1708 1709 .. code:: bash 1710 1711 export FABRIC_CA_CLIENT_HOME=~/clientconfig 1712 fabric-ca-client gencrl -M ~/msp 1713 1714 The next command will create a CRL containing all certificates (expired and unexpired) that were revoked after 1715 2017-09-13T16:39:57-08:00 (specified by the `--revokedafter` flag) and before 2017-09-21T16:39:57-08:00 1716 (specified by the `--revokedbefore` flag) and store the CRL in the `~/msp/crls/crl.pem` file. 1717 1718 .. code:: bash 1719 1720 export FABRIC_CA_CLIENT_HOME=~/clientconfig 1721 fabric-ca-client gencrl --caname "" --revokedafter 2017-09-13T16:39:57-08:00 --revokedbefore 2017-09-21T16:39:57-08:00 -M ~/msp 1722 1723 1724 The `--caname` flag specifies the name of the CA to which this request is sent. In this example, the gencrl request is 1725 sent to the default CA. 1726 1727 The `--revokedafter` and `--revokedbefore` flags specify the lower and upper boundaries of a time period. 1728 The generated CRL will contain certificates that were revoked in this time period. The values must be UTC 1729 timestamps specified in RFC3339 format. The `--revokedafter` timestamp cannot be greater than the 1730 `--revokedbefore` timestamp. 1731 1732 By default, 'Next Update' date of the CRL is set to next day. The `crl.expiry` CA configuration property 1733 can be used to specify a custom value. 1734 1735 The gencrl command will also accept `--expireafter` and `--expirebefore` flags that can be used to generate a CRL 1736 with revoked certificates that expire during the period specified by these flags. For example, the following command 1737 will generate a CRL that contains certificates that were revoked after 2017-09-13T16:39:57-08:00 and 1738 before 2017-09-21T16:39:57-08:00, and that expire after 2017-09-13T16:39:57-08:00 and before 2018-09-13T16:39:57-08:00 1739 1740 .. code:: bash 1741 1742 export FABRIC_CA_CLIENT_HOME=~/clientconfig 1743 fabric-ca-client gencrl --caname "" --expireafter 2017-09-13T16:39:57-08:00 --expirebefore 2018-09-13T16:39:57-08:00 --revokedafter 2017-09-13T16:39:57-08:00 --revokedbefore 2017-09-21T16:39:57-08:00 -M ~/msp 1744 1745 Enabling TLS 1746 ~~~~~~~~~~~~ 1747 1748 This section describes in more detail how to configure TLS for a Fabric CA client. 1749 1750 The following sections may be configured in the ``fabric-ca-client-config.yaml``. 1751 1752 .. code:: yaml 1753 1754 tls: 1755 # Enable TLS (default: false) 1756 enabled: true 1757 certfiles: 1758 - root.pem 1759 client: 1760 certfile: tls_client-cert.pem 1761 keyfile: tls_client-key.pem 1762 1763 The **certfiles** option is the set of root certificates trusted by the 1764 client. This will typically just be the root Fabric CA server's 1765 certificate found in the server's home directory in the **ca-cert.pem** 1766 file. 1767 1768 The **client** option is required only if mutual TLS is configured on 1769 the server. 1770 1771 Attribute-Based Access Control 1772 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1773 1774 Access control decisions can be made by chaincode (and by the Hyperledger Fabric runtime) 1775 based upon an identity's attributes. This is called 1776 **Attribute-Based Access Control**, or **ABAC** for short. 1777 1778 In order to make this possible, an identity's enrollment certificate (ECert) 1779 may contain one or more attribute name and value. The chaincode then 1780 extracts an attribute's value to make an access control decision. 1781 1782 For example, suppose that you are developing application *app1* and want a 1783 particular chaincode operation to be accessible only by app1 administrators. 1784 Your chaincode could verify that the caller's certificate (which was issued by 1785 a CA trusted for the channel) contains an attribute named *app1Admin* with a 1786 value of *true*. Of course the name of the attribute can be anything and the 1787 value need not be a boolean value. 1788 1789 So how do you get an enrollment certificate with an attribute? 1790 There are two methods: 1791 1792 1. When you register an identity, you can specify that an enrollment certificate 1793 issued for the identity should by default contain an attribute. This behavior 1794 can be overridden at enrollment time, but this is useful for establishing 1795 default behavior and, assuming registration occurs outside of your application, 1796 does not require any application change. 1797 1798 The following shows how to register *user1* with two attributes: 1799 *app1Admin* and *email*. 1800 The ":ecert" suffix causes the *appAdmin* attribute to be inserted into user1's 1801 enrollment certificate by default, when the user does not explicitly request 1802 attributes at enrollment time. The *email* attribute is not added 1803 to the enrollment certificate by default. 1804 1805 .. code:: bash 1806 1807 fabric-ca-client register --id.name user1 --id.secret user1pw --id.type client --id.affiliation org1 --id.attrs 'app1Admin=true:ecert,email=user1@gmail.com' 1808 1809 2. When you enroll an identity, you may explicitly request that one or more attributes 1810 be added to the certificate. 1811 For each attribute requested, you may specify whether the attribute is 1812 optional or not. If it is not requested optionally and the identity does 1813 not possess the attribute, an error will occur. 1814 1815 The following shows how to enroll *user1* with the *email* attribute, 1816 without the *app1Admin* attribute, and optionally with the *phone* 1817 attribute (if the user possesses the *phone* attribute). 1818 1819 .. code:: bash 1820 1821 fabric-ca-client enroll -u http://user1:user1pw@localhost:7054 --enrollment.attrs "email,phone:opt" 1822 1823 The table below shows the three attributes which are automatically registered for every identity. 1824 1825 =================================== ===================================== 1826 Attribute Name Attribute Value 1827 =================================== ===================================== 1828 hf.EnrollmentID The enrollment ID of the identity 1829 hf.Type The type of the identity 1830 hf.Affiliation The affiliation of the identity 1831 =================================== ===================================== 1832 1833 To add any of the above attributes **by default** to a certificate, you must 1834 explicitly register the attribute with the ":ecert" specification. 1835 For example, the following registers identity 'user1' so that 1836 the 'hf.Affiliation' attribute will be added to an enrollment certificate if 1837 no specific attributes are requested at enrollment time. Note that the 1838 value of the affiliation (which is 'org1') must be the same in both the 1839 '--id.affiliation' and the '--id.attrs' flags. 1840 1841 .. code:: bash 1842 1843 fabric-ca-client register --id.name user1 --id.secret user1pw --id.type client --id.affiliation org1 --id.attrs 'hf.Affiliation=org1:ecert' 1844 1845 For information on the chaincode library API for Attribute-Based Access Control, 1846 see `https://github.com/hyperledger/fabric/blob/release-1.4/core/chaincode/lib/cid/README.md <https://github.com/hyperledger/fabric/blob/release-1.4/core/chaincode/lib/cid/README.md>`_ 1847 1848 Dynamic Server Configuration Update 1849 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1850 1851 This section describes how to use fabric-ca-client to dynamically update portions 1852 of the fabric-ca-server's configuration without restarting the server. 1853 1854 All commands in this section require that you first be enrolled by executing the 1855 `fabric-ca-client enroll` command. 1856 1857 Dynamically updating identities 1858 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1859 1860 This section describes how to use fabric-ca-client to dynamically update identities. 1861 1862 An authorization failure will occur if the client identity does not satisfy all of the following: 1863 1864 - The client identity must possess the "hf.Registrar.Roles" attribute with a comma-separated list of 1865 values where one of the values equals the type of identity being updated; for example, if the client's 1866 identity has the "hf.Registrar.Roles" attribute with a value of "client", the client can update 1867 identities of type 'client', but not 'peer'. 1868 1869 - The affiliation of the client's identity must be equal to or a prefix of the affiliation of the identity 1870 being updated. For example, a client with an affiliation of "a.b" may update an identity with an affiliation 1871 of "a.b.c" but may not update an identity with an affiliation of "a.c". If root affiliation is required for an 1872 identity, then the update request should specify a dot (".") for the affiliation and the client must also have 1873 root affiliation. 1874 1875 The following shows how to add, modify, and remove an affiliation. 1876 1877 Getting Identity Information 1878 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1879 1880 A caller may retrieve information on a identity from the fabric-ca server as long as the caller meets 1881 the authorization requirements highlighted in the section above. The following command shows how to get an 1882 identity. 1883 1884 .. code:: bash 1885 1886 fabric-ca-client identity list --id user1 1887 1888 A caller may also request to retrieve information on all identities that it is authorized to see by 1889 issuing the following command. 1890 1891 .. code:: bash 1892 1893 fabric-ca-client identity list 1894 1895 Adding an identity 1896 """"""""""""""""""" 1897 1898 The following adds a new identity for 'user1'. Adding a new identity performs the same action as registering an 1899 identity via the 'fabric-ca-client register' command. There are two available methods for adding a new identity. 1900 The first method is via the `--json` flag where you describe the identity in a JSON string. 1901 1902 .. code:: bash 1903 1904 fabric-ca-client identity add user1 --json '{"secret": "user1pw", "type": "client", "affiliation": "org1", "max_enrollments": 1, "attrs": [{"name": "hf.Revoker", "value": "true"}]}' 1905 1906 The following adds a user with root affiliation. Note that an affiliation name of "." means the root affiliation. 1907 1908 .. code:: bash 1909 1910 fabric-ca-client identity add user1 --json '{"secret": "user1pw", "type": "client", "affiliation": ".", "max_enrollments": 1, "attrs": [{"name": "hf.Revoker", "value": "true"}]}' 1911 1912 The second method for adding an identity is to use direct flags. See the example below for adding 'user1'. 1913 1914 .. code:: bash 1915 1916 fabric-ca-client identity add user1 --secret user1pw --type client --affiliation . --maxenrollments 1 --attrs hf.Revoker=true 1917 1918 The table below lists all the fields of an identity and whether they are required or optional, and any default values they might have. 1919 1920 +----------------+------------+------------------------+ 1921 | Fields | Required | Default Value | 1922 +================+============+========================+ 1923 | ID | Yes | | 1924 +----------------+------------+------------------------+ 1925 | Secret | No | | 1926 +----------------+------------+------------------------+ 1927 | Affiliation | No | Caller's Affiliation | 1928 +----------------+------------+------------------------+ 1929 | Type | No | client | 1930 +----------------+------------+------------------------+ 1931 | Maxenrollments | No | 0 | 1932 +----------------+------------+------------------------+ 1933 | Attributes | No | | 1934 +----------------+------------+------------------------+ 1935 1936 1937 Modifying an identity 1938 """""""""""""""""""""" 1939 1940 There are two available methods for modifying an existing identity. The first method is via the `--json` flag where you describe 1941 the modifications in to an identity in a JSON string. Multiple modifications can be made in a single request. Any element of an identity that 1942 is not modified will retain its original value. 1943 1944 NOTE: A maxenrollments value of "-2" specifies that the CA's max enrollment setting is to be used. 1945 1946 The command below make multiple modification to an identity using the --json flag. 1947 1948 .. code:: bash 1949 1950 fabric-ca-client identity modify user1 --json '{"secret": "newPassword", "affiliation": ".", "attrs": [{"name": "hf.Regisrar.Roles", "value": "peer,client"},{"name": "hf.Revoker", "value": "true"}]}' 1951 1952 The commands below make modifications using direct flags. The following updates the enrollment secret (or password) for identity 'user1' to 'newsecret'. 1953 1954 .. code:: bash 1955 1956 fabric-ca-client identity modify user1 --secret newsecret 1957 1958 The following updates the affiliation of identity 'user1' to 'org2'. 1959 1960 .. code:: bash 1961 1962 fabric-ca-client identity modify user1 --affiliation org2 1963 1964 The following updates the type of identity 'user1' to 'peer'. 1965 1966 .. code:: bash 1967 1968 fabric-ca-client identity modify user1 --type peer 1969 1970 1971 The following updates the maxenrollments of identity 'user1' to 5. 1972 1973 .. code:: bash 1974 1975 fabric-ca-client identity modify user1 --maxenrollments 5 1976 1977 By specifying a maxenrollments value of '-2', the following causes identity 'user1' to use 1978 the CA's max enrollment setting. 1979 1980 .. code:: bash 1981 1982 fabric-ca-client identity modify user1 --maxenrollments -2 1983 1984 The following sets the value of the 'hf.Revoker' attribute for identity 'user1' to 'false'. 1985 If the identity has other attributes, they are not changed. If the identity did not previously 1986 possess the 'hf.Revoker' attribute, the attribute is added to the identity. An attribute may 1987 also be removed by specifying no value for the attribute. 1988 1989 .. code:: bash 1990 1991 fabric-ca-client identity modify user1 --attrs hf.Revoker=false 1992 1993 The following removes the 'hf.Revoker' attribute for user 'user1'. 1994 1995 .. code:: bash 1996 1997 fabric-ca-client identity modify user1 --attrs hf.Revoker= 1998 1999 The following demonstrates that multiple options may be used in a single `fabric-ca-client identity modify` 2000 command. In this case, both the secret and the type are updated for user 'user1'. 2001 2002 .. code:: bash 2003 2004 fabric-ca-client identity modify user1 --secret newpass --type peer 2005 2006 Removing an identity 2007 """"""""""""""""""""" 2008 2009 The following removes identity 'user1' and also revokes any certificates associated with the 'user1' identity. 2010 2011 .. code:: bash 2012 2013 fabric-ca-client identity remove user1 2014 2015 Note: Removal of identities is disabled in the fabric-ca-server by default, but may be enabled 2016 by starting the fabric-ca-server with the `--cfg.identities.allowremove` option. 2017 2018 Dynamically updating affiliations 2019 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2020 2021 This section describes how to use fabric-ca-client to dynamically update affiliations. The 2022 following shows how to add, modify, remove, and list an affiliation. 2023 2024 Adding an affiliation 2025 """"""""""""""""""""""" 2026 2027 An authorization failure will occur if the client identity does not satisfy all of the following: 2028 2029 - The client identity must possess the attribute 'hf.AffiliationMgr' with a value of 'true'. 2030 - The affiliation of the client identity must be hierarchically above the affiliation being updated. 2031 For example, if the client's affiliation is "a.b", the client may add affiliation "a.b.c" but not 2032 "a" or "a.b". 2033 2034 The following adds a new affiliation named ‘org1.dept1’. 2035 2036 .. code:: bash 2037 2038 fabric-ca-client affiliation add org1.dept1 2039 2040 Modifying an affiliation 2041 """"""""""""""""""""""""" 2042 2043 An authorization failure will occur if the client identity does not satisfy all of the following: 2044 2045 - The client identity must possess the attribute 'hf.AffiliationMgr' with a value of 'true'. 2046 - The affiliation of the client identity must be hierarchically above the affiliation being updated. 2047 For example, if the client's affiliation is "a.b", the client may add affiliation "a.b.c" but not 2048 "a" or "a.b". 2049 - If the '--force' option is true and there are identities which must be modified, the client 2050 identity must also be authorized to modify the identity. 2051 2052 The following renames the 'org2' affiliation to 'org3'. It also renames any sub affiliations 2053 (e.g. 'org2.department1' is renamed to 'org3.department1'). 2054 2055 .. code:: bash 2056 2057 fabric-ca-client affiliation modify org2 --name org3 2058 2059 If there are identities that are affected by the renaming of an affiliation, it will result in 2060 an error unless the '--force' option is used. Using the '--force' option will update the affiliation 2061 of identities that are affected to use the new affiliation name. 2062 2063 .. code:: bash 2064 2065 fabric-ca-client affiliation modify org1 --name org2 --force 2066 2067 Removing an affiliation 2068 """"""""""""""""""""""""" 2069 2070 An authorization failure will occur if the client identity does not satisfy all of the following: 2071 2072 - The client identity must possess the attribute 'hf.AffiliationMgr' with a value of 'true'. 2073 - The affiliation of the client identity must be hierarchically above the affiliation being updated. 2074 For example, if the client's affiliation is "a.b", the client may remove affiliation "a.b.c" but not 2075 "a" or "a.b". 2076 - If the '--force' option is true and there are identities which must be modified, the client 2077 identity must also be authorized to modify the identity. 2078 2079 The following removes affiliation 'org2' and also any sub affiliations. 2080 For example, if 'org2.dept1' is an affiliation below 'org2', it is also removed. 2081 2082 .. code:: bash 2083 2084 fabric-ca-client affiliation remove org2 2085 2086 If there are identities that are affected by the removing of an affiliation, it will result 2087 in an error unless the '--force' option is used. Using the '--force' option will also remove 2088 all identities that are associated with that affiliation, and the certificates associated with 2089 any of these identities. 2090 2091 Note: Removal of affiliations is disabled in the fabric-ca-server by default, but may be enabled 2092 by starting the fabric-ca-server with the `--cfg.affiliations.allowremove` option. 2093 2094 Listing affiliation information 2095 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2096 2097 An authorization failure will occur if the client identity does not satisfy all of the following: 2098 2099 - The client identity must possess the attribute 'hf.AffiliationMgr' with a value of 'true'. 2100 - Affiliation of the client identity must be equal to or be hierarchically above the 2101 affiliation being updated. For example, if the client's affiliation is "a.b", 2102 the client may get affiliation information on "a.b" or "a.b.c" but not "a" or "a.c". 2103 2104 The following command shows how to get a specific affiliation. 2105 2106 .. code:: bash 2107 2108 fabric-ca-client affiliation list --affiliation org2.dept1 2109 2110 A caller may also request to retrieve information on all affiliations that it is authorized to see by 2111 issuing the following command. 2112 2113 .. code:: bash 2114 2115 fabric-ca-client affiliation list 2116 2117 Manage Certificates 2118 ~~~~~~~~~~~~~~~~~~~~ 2119 2120 This section describes how to use fabric-ca-client to manage certificates. 2121 2122 Listing certificate information 2123 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2124 2125 The certificates that are visible to a caller include: 2126 2127 - Those certificates which belong to the caller 2128 - If the caller possesses the ``hf.Registrar.Roles`` attribute or the ``hf.Revoker`` attribute with a value of ``true``, 2129 all certificates which belong to identities in and below the caller's affiliation. For example, if the client's 2130 affiliation is ``a.b``, the client may get certificates for identities who's affiliation 2131 is ``a.b`` or ``a.b.c`` but not ``a`` or ``a.c``. 2132 2133 If executing a list command that requests certificates of more than one identity, only certificates of identities 2134 with an affiliation that is equal to or hierarchically below the caller's affiliation will be listed. 2135 2136 The certificates which will be listed may be filtered based on ID, AKI, serial number, expiration time, revocation time, notrevoked, and notexpired flags. 2137 2138 * ``id``: List certificates for this enrollment ID 2139 * ``serial``: List certificates that have this serial number 2140 * ``aki``: List certificates that have this AKI 2141 * ``expiration``: List certificates that have expiration dates that fall within this expiration time 2142 * ``revocation``: List certificates that were revoked within this revocation time 2143 * ``notrevoked``: List certificates that have not yet been revoked 2144 * ``notexpired``: List certificates that have not yet expired 2145 2146 You can use flags ``notexpired`` and ``notrevoked`` as filters to exclude revoked certificates and/or expired certificates from the result set. 2147 For example, if you only care about certificates that have expired but have not been revoked you can use the ``expiration`` and ``notrevoked`` flags to 2148 get back such results. An example of this case is provided below. 2149 2150 Time should be specified based on RFC3339. For instance, to list certificates that have expirations between 2151 March 1, 2018 at 1:00 PM and June 15, 2018 at 2:00 AM, the input time string would look like 2018-03-01T13:00:00z 2152 and 2018-06-15T02:00:00z. If time is not a concern, and only the dates matter, then the time part can be left 2153 off and then the strings become 2018-03-01 and 2018-06-15. 2154 2155 The string ``now`` may be used to denote the current time and the empty string to denote any time. For example, ``now::`` denotes 2156 a time range from now to any time in the future, and ``::now`` denotes a time range from any time in the past until now. 2157 2158 The following command shows how to list certificates using various filters. 2159 2160 List all certificates: 2161 2162 .. code:: bash 2163 2164 fabric-ca-client certificate list 2165 2166 List all certificates by id: 2167 2168 .. code:: bash 2169 2170 fabric-ca-client certificate list --id admin 2171 2172 List certificate by serial and aki: 2173 2174 .. code:: bash 2175 2176 fabric-ca-client certificate list --serial 1234 --aki 1234 2177 2178 List certificate by id and serial/aki: 2179 2180 .. code:: bash 2181 2182 fabric-ca-client certificate list --id admin --serial 1234 --aki 1234 2183 2184 List certificates that are neither revoker nor expired by id: 2185 2186 .. code:: bash 2187 2188 fabric-ca-client certificate list --id admin --notrevoked --notexpired 2189 2190 List all certificates that have not been revoked for an id (admin): 2191 2192 .. code:: bash 2193 2194 fabric-ca-client certificate list --id admin --notrevoked 2195 2196 List all certificates have not expired for an id (admin): 2197 2198 The "--notexpired" flag is equivalent to "--expiration now::", which means certificates 2199 will expire some time in the future. 2200 2201 .. code:: bash 2202 2203 fabric-ca-client certificate list --id admin --notexpired 2204 2205 List all certificates that were revoked between a time range for an id (admin): 2206 2207 .. code:: bash 2208 2209 fabric-ca-client certificate list --id admin --revocation 2018-01-01T01:30:00z::2018-01-30T05:00:00z 2210 2211 List all certificates that were revoked between a time range but have not expired for an id (admin): 2212 2213 .. code:: bash 2214 2215 fabric-ca-client certificate list --id admin --revocation 2018-01-01::2018-01-30 --notexpired 2216 2217 List all revoked certificates using duration (revoked between 30 days and 15 days ago) for an id (admin): 2218 2219 .. code:: bash 2220 2221 fabric-ca-client certificate list --id admin --revocation -30d::-15d 2222 2223 List all revoked certificates before a time 2224 2225 .. code:: bash 2226 2227 fabric-ca-client certificate list --revocation ::2018-01-30 2228 2229 List all revoked certificates after a time 2230 2231 .. code:: bash 2232 2233 fabric-ca-client certificate list --revocation 2018-01-30:: 2234 2235 List all revoked certificates before now and after a certain date 2236 2237 .. code:: bash 2238 2239 fabric-ca-client certificate list --id admin --revocation 2018-01-30::now 2240 2241 List all certificate that expired between a time range but have not been revoked for an id (admin): 2242 2243 .. code:: bash 2244 2245 fabric-ca-client certificate list --id admin --expiration 2018-01-01::2018-01-30 --notrevoked 2246 2247 List all expired certificates using duration (expired between 30 days and 15 days ago) for an id (admin): 2248 2249 .. code:: bash 2250 2251 fabric-ca-client certificate list --expiration -30d::-15d 2252 2253 List all certificates that have expired or will expire before a certain time 2254 2255 .. code:: bash 2256 2257 fabric-ca-client certificate list --expiration ::2058-01-30 2258 2259 List all certificates that have expired or will expire after a certain time 2260 2261 .. code:: bash 2262 2263 fabric-ca-client certificate list --expiration 2018-01-30:: 2264 2265 List all expired certificates before now and after a certain date 2266 2267 .. code:: bash 2268 2269 fabric-ca-client certificate list --expiration 2018-01-30::now 2270 2271 List certificates expiring in the next 10 days: 2272 2273 .. code:: bash 2274 2275 fabric-ca-client certificate list --id admin --expiration ::+10d --notrevoked 2276 2277 The list certificate command can also be used to store certificates on the file 2278 system. This is a convenient way to populate the admins folder in an MSP, The "-store" flag 2279 points to the location on the file system to store the certificates. 2280 2281 Configure an identity to be an admin, by storing certificates for an identity 2282 in the MSP: 2283 2284 .. code:: bash 2285 2286 export FABRIC_CA_CLIENT_HOME=/tmp/clientHome 2287 fabric-ca-client certificate list --id admin --store msp/admincerts 2288 2289 Contact specific CA instance 2290 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2291 2292 When a server is running multiple CA instances, requests can be directed to a 2293 specific CA. By default, if no CA name is specified in the client request the 2294 request will be directed to the default CA on the fabric-ca server. A CA name 2295 can be specified on the command line of a client command using the ``caname`` 2296 filter as follows: 2297 2298 .. code:: bash 2299 2300 fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 --caname <caname> 2301 2302 `Back to Top`_ 2303 2304 Configuring an HSM 2305 ------------------ 2306 By default, the Fabric CA server and client store private keys in a PEM-encoded file, 2307 but they can also be configured to store private keys in an HSM (Hardware Security Module) 2308 via PKCS11 APIs. This behavior is configured in the BCCSP (BlockChain Crypto Service Provider) 2309 section of the server’s or client’s configuration file. Currently, Fabric only 2310 supports the PKCS11 standard to communicate with an HSM. 2311 2312 Example 2313 ~~~~~~~ 2314 2315 The following example demonstrates how to configure the Fabric CA server or 2316 client to use a software version of PKCS11 called SoftHSM (see https://github.com/opendnssec/SoftHSMv2). 2317 2318 After installing SoftHSM, make sure to set your SOFTHSM2_CONF environment variable to 2319 point to the location where the SoftHSM2 configuration file is stored. The config file looks like 2320 2321 .. code:: 2322 2323 directories.tokendir = /tmp/ 2324 objectstore.backend = file 2325 log.level = INFO 2326 2327 You can find example configuration file named SoftHSM2.conf under testdata directory. 2328 2329 Create a token, label it “ForFabric”, set the pin to ‘98765432’ 2330 (refer to SoftHSM documentation). 2331 2332 You can use both the config file and environment variables to configure BCCSP. 2333 For example, set the bccsp section of Fabric CA server configuration file as follows. 2334 Note that the default field’s value is PKCS11. 2335 2336 .. code:: yaml 2337 2338 ############################################################################# 2339 # BCCSP (BlockChain Crypto Service Provider) section is used to select which 2340 # crypto library implementation to use 2341 ############################################################################# 2342 bccsp: 2343 default: PKCS11 2344 pkcs11: 2345 Library: /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so 2346 Pin: 98765432 2347 Label: ForFabric 2348 hash: SHA2 2349 security: 256 2350 filekeystore: 2351 # The directory used for the software file-based keystore 2352 keystore: msp/keystore 2353 2354 And you can override relevant fields via environment variables as follows: 2355 2356 .. code:: bash 2357 2358 FABRIC_CA_SERVER_BCCSP_DEFAULT=PKCS11 2359 FABRIC_CA_SERVER_BCCSP_PKCS11_LIBRARY=/usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so 2360 FABRIC_CA_SERVER_BCCSP_PKCS11_PIN=98765432 2361 FABRIC_CA_SERVER_BCCSP_PKCS11_LABEL=ForFabric 2362 2363 2364 The prebuilt Hyperledger Fabric Docker images are not enabled to use PKCS11. If 2365 you are deploying the Fabric CA using Docker, you need to build your own image 2366 and enable PKCS11 using the following command: 2367 2368 .. code:: bash 2369 2370 make docker GO_TAGS=pkcs11 2371 2372 You also need to ensure that the PKCS11 library is available to be used by the 2373 CA by installing it or mounting it inside the container. If you are deploying 2374 your Fabric CA using Docker Compose, you can update your Compose files to mount 2375 the SoftHSM library and configuration file inside the container using volumes. 2376 As an example, you would add the following environment and volumes variables to 2377 your Docker Compose file: 2378 2379 .. code:: 2380 2381 environment: 2382 - SOFTHSM2_CONF=/etc/hyperledger/fabric/config.file 2383 volumes: 2384 - /home/softhsm/config.file:/etc/hyperledger/fabric/config.file 2385 - /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so:/etc/hyperledger/fabric/libsofthsm2.so 2386 2387 2388 `Back to Top`_ 2389 2390 File Formats 2391 ------------ 2392 2393 Fabric CA server's configuration file format 2394 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2395 2396 A default configuration file is created in the server's home directory 2397 (see `Fabric CA Server <#server>`__ section for more info). The following 2398 link shows a sample :doc:`Server configuration file <serverconfig>`. 2399 2400 Fabric CA client's configuration file format 2401 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2402 2403 A default configuration file is created in the client's home directory 2404 (see `Fabric CA Client <#client>`__ section for more info). The following 2405 link shows a sample :doc:`Client configuration file <clientconfig>`. 2406 2407 `Back to Top`_ 2408 2409 Troubleshooting 2410 --------------- 2411 2412 1. If you see a ``Killed: 9`` error on OSX when trying to execute 2413 ``fabric-ca-client`` or ``fabric-ca-server``, there is a long thread 2414 describing this problem at https://github.com/golang/go/issues/19734. 2415 The short answer is that to work around this issue, you can run the 2416 following command:: 2417 2418 # sudo ln -s /usr/bin/true /usr/local/bin/dsymutil 2419 2420 2. The error ``[ERROR] No certificates found for provided serial and aki`` will occur 2421 if the following sequence of events occurs: 2422 2423 a. You issue a `fabric-ca-client enroll` command, creating an enrollment certificate (i.e. an ECert). 2424 This stores a copy of the ECert in the fabric-ca-server's database. 2425 b. The fabric-ca-server's database is deleted and recreated, thus losing the ECert from step 'a'. 2426 For example, this may happen if you stop and restart a Docker container hosting the fabric-ca-server, 2427 but your fabric-ca-server is using the default sqlite database and the database file is not stored 2428 on a volume and is therefore not persistent. 2429 c. You issue a `fabric-ca-client register` command or any other command which tries to use the ECert from 2430 step 'a'. In this case, since the database no longer contains the ECert, the 2431 ``[ERROR] No certificates found for provided serial and aki`` will occur. 2432 2433 To resolve this error, you must enroll again by repeating step 'a'. This will issue a new ECert 2434 which will be stored in the current database. 2435 2436 3. When sending multiple parallel requests to a Fabric CA Server cluster that uses shared sqlite3 databases, 2437 the server occasionally returns a 'database locked' error. This is most probably because the database 2438 transaction timed out while waiting for database lock (held by another cluster member) to be released. 2439 This is an invalid configuration because sqlite is an embedded database, which means the Fabric CA server 2440 cluster must share the same file via a shared file system, which introduces a SPoF (single point of failure), 2441 which contradicts the purpose of cluster topology. The best practice is to use either Postgres or MySQL 2442 databases in a cluster topology. 2443 2444 4. Suppose an error similar to 2445 ``Failed to deserialize creator identity, err The supplied identity is not valid, Verify() returned x509: certificate signed by unknown authority`` 2446 is returned by a peer or orderer when using an enrollment certificate issued by the Fabric CA Server. This indicates that 2447 the signing CA certificate used by the Fabric CA Server to issue certificates does not match a certificate in the `cacerts` or `intermediatecerts` 2448 folder of the MSP used to make authorization checks. 2449 2450 The MSP which is used to make authorization checks depends on which operation you were performing when the error occurred. 2451 For example, if you were trying to install chaincode on a peer, the local MSP on the file system of the peer is used; 2452 otherwise, if you were performing some channel specific operation such as instantiating chaincode on a specific channel, 2453 the MSP in the genesis block or the most recent configuration block of the channel is used. 2454 2455 To confirm that this is the problem, compare the AKI (Authority Key Identifier) of the enrollment certificate 2456 to the SKI (Subject Key Identifier) of the certificate(s) in the `cacerts` and `intermediatecerts` folder of appropriate MSP. 2457 The command `openssl x509 -in <PEM-file> -noout -text | grep -A1 "Authority Key Identifier"` will display the AKI and 2458 `openssl x509 -in <PEM-file> -noout -text | grep -A1 "Subject Key Identifier"` will display the SKI. 2459 If they are not equal, you have confirmed that this is the cause of the error. 2460 2461 This can happen for multiple reasons including: 2462 2463 a. You used `cryptogen` to generate your key material but did not start `fabric-ca-server` with the signing key and certificate generated 2464 by `cryptogen`. 2465 2466 To resolve (assuming `FABRIC_CA_SERVER_HOME` is set to the home directory of your `fabric-ca-server`): 2467 2468 1. Stop `fabric-ca-server`. 2469 2. Copy `crypto-config/peerOrganizations/<orgName>/ca/*pem` to `$FABRIC_CA_SERVER_HOME/ca-cert.pem`. 2470 3. Copy `crypto-config/peerOrganizations/<orgName>/ca/*_sk` to `$FABRIC_CA_SERVER_HOME/msp/keystore/`. 2471 4. Start `fabric-ca-server`. 2472 5. Delete any previously issued enrollment certificates and get new certificates by enrolling again. 2473 2474 b. You deleted and recreated the CA signing key and certificate used by the Fabric CA Server after generating the genesis block. 2475 This can happen if the Fabric CA Server is running in a Docker container, the container was restarted, and its home directory 2476 is not on a volume mount. In this case, the Fabric CA Server will create a new CA signing key and certificate. 2477 2478 Assuming that you can not recover the original CA signing key, the only way to recover from this scenario is to update the 2479 certificate in the `cacerts` (or `intermediatecerts`) of the appropriate MSPs to the new CA certificate. 2480 2481 .. Licensed under Creative Commons Attribution 4.0 International License 2482 https://creativecommons.org/licenses/by/4.0/