Corda подписывает встроенную флягу по умолчанию, но настаивает на том, чтобы я добавил учетные данные для подписи или включил false - PullRequest
1 голос
/ 09 октября 2019

Я клонировал репозиторий corda-training-template и хотел проверить ограничения подписи в Corda v4.x. Вместо того, чтобы получить тестовый ключ для подписи фляги, я бы для удобства выбрал стандартный ключ corda dev. Тем не менее, я понимаю, что шнур dev-key используется по умолчанию, если вы не вводите никаких пользовательских учетных данных, чтобы все jar-файлы были подписаны им. Однако он продолжает печатать сообщение об ошибке во время сборки как:

 * What went wrong:
 Execution failed for task ':kotlin-source:jar'. > Exception while signing kotlin-source-0.1.jar, ensure the 'cordapp.signing.options' entry contains correct keyStore configuration, or disable signing by 'cordapp.signing.enabled false'. Run with --info or --debug option and search for 'ant:signjar' in log output. 

Ниже приведен оригинальный build.gradle для kotlin-source с удаленной подписью enable false:

repositories {
mavenLocal()
jcenter()
mavenCentral()
maven { url 'https://dl.bintray.com/kotlin/exposed' }
maven { url 'https://jitpack.io' }
maven { url 'https://ci-artifactory.corda.r3cev.com/artifactory/corda-releases' }
}

apply plugin: 'kotlin'
apply plugin: 'idea'
apply plugin: 'net.corda.plugins.cordapp'
apply plugin: 'net.corda.plugins.publish-utils'
apply plugin: 'net.corda.plugins.cordformation'
apply plugin: 'net.corda.plugins.quasar-utils'
apply plugin: 'maven-publish'

cordapp {
targetPlatformVersion 4
minimumPlatformVersion 3
    contract {
        name "Corda Training Material"
        vendor "R3"
        licence "Contact R3 for Kotlin Source Contract License."
        versionId 1
    }
    workflow {
        name "Corda Training Material"
        vendor "R3"
        licence "Contact R3 for Kotlin Source Workflow License."
        versionId 1
    }
}

sourceSets {
    main {
        resources {
            srcDir "../config/dev"
         }
    }
    test {
        resources {
            srcDir "../config/test"
        }
    }
}

dependencies {
     compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
     testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
     testCompile "junit:junit:$junit_version"

     // Corda integration dependencies
     cordaCompile "$corda_release_distribution:corda-core:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-finance-contracts:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-finance-workflows:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-jackson:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-rpc:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-node-api:$corda_release_version"
     cordaCompile "$corda_release_distribution:corda-webserver-impl:$corda_release_version"
     cordaRuntime "$corda_release_distribution:corda:$corda_release_version"
     cordaRuntime "$corda_release_distribution:corda-webserver:$corda_release_version"

     testCompile "$corda_release_distribution:corda-test-utils:$corda_release_version"
     testCompile "$corda_release_distribution:corda-node-driver:$corda_release_version"


      // GraphStream: For visualisation (required by TemplateClientRPC app)
      compile "org.graphstream:gs-core:1.3"
      compile("org.graphstream:gs-ui:1.3") {
      exclude group: "bouncycastle"
      }

      // CorDapp dependencies
      // Specify your cordapp's dependencies below, including dependent cordapps
      cordapp "$corda_release_distribution:corda-finance-contracts:$corda_release_version"
      cordapp "$corda_release_distribution:corda-finance-workflows:$corda_release_version"
      cordapp "$corda_release_distribution:corda-confidential-identities:$corda_release_version"
}

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
      kotlinOptions {
           languageVersion = "1.2"
           apiVersion = "1.2"
           jvmTarget = "1.8"
           javaParameters = true   // Useful for reflection.
      }
}

task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
      delete "./build/nodes"
      directory "./build/nodes"

      nodeDefaults {

            cordapp("$corda_release_distribution:corda-finance-contracts:$corda_release_version")
            cordapp("$corda_release_distribution:corda-finance-workflows:$corda_release_version")
            cordapp("$corda_release_distribution:corda-confidential-identities:$corda_release_version")
            rpcUsers = [[ user: "user1", "password": "password", "permissions": ["ALL"]]]
      }

      node {
           name "O=Notary,L=London,C=GB"
           notary = [validating: false]
           p2pPort 10002
           rpcSettings {
                 useSsl false
                 standAloneBroker false
                 address "0.0.0.0:10003"
                 adminAddress "0.0.0.0:10103"
           }
      }
      node {
           name "O=ParticipantA,L=London,C=GB"
           p2pPort 10007
           webPort 10009
           rpcSettings {
                 useSsl false
                 standAloneBroker false
                 address "0.0.0.0:10008"
                 adminAddress "0.0.0.0:10108"
           }
     }
     node {
          name "O=ParticipantB,L=New York,C=US"
          p2pPort 10010
          webPort 10012
          rpcSettings {
                 useSsl false
                 standAloneBroker false
                 address "0.0.0.0:10011"
                 adminAddress "0.0.0.0:10111"
          }
     }
     node {
          name "O=ParticipantC,L=Paris,C=FR"
          p2pPort 10013
          webPort 10015
          rpcSettings {
                 useSsl false
                 standAloneBroker false
                 address "0.0.0.0:10014"
                 adminAddress "0.0.0.0:10114"
          }
     } 
 }

 idea {
      module {
          downloadJavadoc = true // defaults to false
          downloadSources = true
      }
 }

InВ ответ на сообщение об ошибке я добавил следующее в build.gradle под обоими запросами cordapp (https://docs.corda.net/releases/release-V4.0/cordapp-build-systems.html#signing-the-cordapp-jar) и deployNodes (https://docs.corda.net/releases/release-V4.0/generating-a-node.html#signing-cordapp-jars)) в разных перестановках, но одно и то же сообщение об ошибке с запросом правильной конфигурации хранилища ключей сохраняетпоказывается:

 signing {
       enabled true
       options {
            keystore 
            alias
            storepass
            storetype
            keyalg
       }
 }

Без упоминания учетных данных хранилища ключей или даже без указания параметров подписи, corda должен собрать банку с ключами dev по умолчанию, но это не так.

1 Ответ

1 голос
/ 09 октября 2019

Для начала сообщение об ошибке вводит в заблуждение и не говорит точно, что происходит в инструменте jarsigner java (см. Ant signjar). Вместо этого есть вероятность, что с банкой есть проблема, из-за которой jarsigner не может подписать. SignJar.kt (строки с 23 по 24) из corda core plugin выдает универсальное сообщение об ошибке при обнаружении ошибки, поэтому необходимо будет выполнить задачи jar в режиме --info или --debug с последующим сканированием сообщенийдля [ant: signjar].

В моем случае после запуска задачи подписи jar в режиме --debug показывалось сообщение об ошибке следующего:

 01:00:15.040 [INFO] [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:signjar] jarsigner: unable to sign jar: java.util.zip.ZipException: duplicate entry: META-INF/LICENSE.txt

Вероятно, проблема в то время какпытаясь выполнить fatjar (с другими библиотеками), файлы лицензий из других jar-файлов вызывают конфликт. Решение в моем случае - исключить файл лицензии из моей сборки. Добавьте следующее в задачу jar build.gradle.

 jar {
     duplicatesStrategy = DuplicatesStrategy.EXCLUDE
 }

После того, как я собрал jar, я использовал инструмент jarsigner (включенный в ваш JDK), чтобы проверить, подписан ли jar.

 jarsigner -verify <your jar.file name>

Если он подписан, он выведет следующее:

 jar verified.

 Warning:
 This jar contains entries whose certificate chain is not validated.
 This jar contains entries whose signer certificate will expire within six months.

 This jar contains signatures that does not include a timestamp. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2019-11-26) or after any future revocation date.

 Re-run with the -verbose and -certs options for more details.
...