Skip to content

CAMEL-25645: camel-milo - let the OPC UA client validate the server certificate against a trust list - #27824

Merged
davsclaus merged 4 commits into
apache:mainfrom
oscerd:fix/CAMEL-25645
Oct 16, 2026
Merged

davsclaus merged 4 commits into
apache:mainfrom
oscerd:fix/CAMEL-25645

Conversation

@oscerd

@oscerd oscerd commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Summary

CAMEL-25645

milo-client and milo-browse built the Eclipse Milo client configuration without a certificate validator, so they kept Milo's default, CertificateValidator.InsecureCertificateValidator, and the certificate of a server offering a Sign or SignAndEncrypt endpoint was not checked. The client had no option to configure trust material.

This PR:

  • adds three client options, at component and endpoint level, shared by milo-client and milo-browse:

    • trustListDirectory: a trust list in Eclipse Milo's file based layout (trusted/certs, trusted/crl, issuer/certs, issuer/crl).
    • certificateValidator: a custom CertificateValidator bean, used instead of the trust list. It is not autowired.
    • trustAllCertificates: accept any server certificate, marked security = "insecure:ssl".
  • validates the server certificate whenever the selected endpoint uses a security policy other than None. When neither trustListDirectory nor certificateValidator is set and trustAllCertificates is false, the client does not connect.

  • builds the trust list validator with APPLICATION_URI, VALIDITY and REVOCATION. It refuses a server certificate that:

    • does not chain up to a trusted certificate;
    • is outside its validity period;
    • is revoked;
    • or whose application URI differs from the server's.

    As OPC UA requires, a CA-issued certificate needs a CRL of its CA in the trust list (an empty one is enough). A self-signed certificate of the trust list is not checked for revocation. Only a certificate without a chain up to a trusted certificate is written to rejected/certs.

  • uses the same validator for the secure channel, the session and the UsernameProvider that encrypts the user name and password.

  • logs a missing trust configuration, or a UaException with a certificate or security status code, at WARN as a single line (stack trace at DEBUG). The client keeps retrying every 10 seconds, so a certificate moved to trusted/certs is used at the next attempt. The last connect failure is the cause of the No connected exception that a producer gets.

  • creates the file based trust list once per connection and closes it when the connection is disposed, since it watches its directories.

  • adds the trust settings to the connection cache id (the validator's class name and identity hash), so endpoints that validate the server differently do not share a connection.

  • documents the options and the checks in milo-client-component.adoc (new "Validating the server certificate" section), recommends restricting allowedSecurityPolicies, and adds a 4.24 upgrade guide entry that names the log message users will see.

Endpoints that use the security policy None are not affected.

Tests

  • ServerCertificateTrustTest (13): the choice of validator, a trusted certificate accepted, an untrusted one refused (Bad_SecurityChecksFailed) and written to rejected/certs. Certificates issued with Bouncy Castle (TestPki) cover:

    • revoked: Bad_CertificateRevoked;
    • CA without CRL: Bad_CertificateRevocationUnknown;
    • CA with an empty CRL: accepted;
    • expired self-signed: Bad_CertificateTimeInvalid;
    • another application URI: Bad_CertificateUriInvalid.

    None of these is written to rejected/certs. The class also checks the classification of connection failures.

  • MiloClientConfigurationTest: the cache id is unchanged without trust settings and differs with them; copy and clone keep the settings.

  • ServerCertificateValidationTest: a server that only offers a Basic256Sha256 endpoint.

    • The clients with a trust list holding the server certificate, with trustAllCertificates=true, or with a certificateValidator bean receive the monitored value.
    • The clients with an empty trust list or without trust configuration do not. A producer sharing their connection fails with No connected, caused by the missing trust configuration or by Bad_SecurityChecksFailed, and the rejected certificate is written to the trust list.
  • camel-milo module: 72 tests, 0 failures, 1 skipped (MonitorItemMultiConnectionsCertTest, already @Disabled), including the tests of CAMEL-25566 (CAMEL-25566: camel-milo - monitor several nodes with one consumer #27780), which this branch is rebased on. A full reactor build regenerated the catalog, the DSL factories and SecurityUtils.

  • Revert checks:

    • With Milo's default check set, the revoked, expired and CRL-less certificates are accepted and those tests fail.
    • Without the cause on No connected, the end-to-end test fails on the reason assertion.
    • With the previous accept-all behaviour, the client without trust configuration receives the monitored value.

MonitorItemMultiConnectionsCertTest is still @Disabled, as before. The new test sets up the secured server through the component's certificateManager option.

Upgrade

Clients that use a secured security policy need trustListDirectory or certificateValidator after upgrading. trustAllCertificates=true restores the previous behaviour, which is insecure.

Claude Code on behalf of Andrea Cosentino

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

🌟 Thank you for your contribution to the Apache Camel project! 🌟
🤖 CI automation will test this PR automatically.

🐫 Apache Camel Committers, please review the following items:

  • First-time contributors require MANUAL approval for the GitHub Actions to run
  • You can use the command /component-test (camel-)component-name1 (camel-)component-name2.. to request a test from the test bot although they are normally detected and executed by CI.
  • You can label PRs using skip-tests and test-dependents to fine-tune the checks executed by this PR.
  • Build and test logs are available in the summary page. Only Apache Camel committers have access to the summary.

⚠️ Be careful when sharing logs. Review their contents before sharing them publicly.

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @oscerd. Closing this gap in the client is the right thing to do, and keeping the old behaviour behind an explicit trustAllCertificates flag with security = "insecure:ssl" is the right shape.

What I verified against Eclipse Milo 1.1.8 (the version in parent/pom.xml, sources from Maven Central):

  • The claim holds. OpcUaClientConfigBuilder defaults to InsecureCertificateValidator, and the two-argument UsernameProvider constructor uses it too.
  • The validator set with cfg.setCertificateValidator is the one Milo uses in the secure channel handshake (UascClientMessageHandler, policy not None) and on CreateSession (SessionFsmFactory). UsernameProvider only calls its validator when the endpoint policy is None (or HTTPS), so passing the same validator there matters for a None endpoint with a trust list.
  • Trust list lifecycle: it is created lazily under the lock and reused across reconnects. dispose() closes it, and the closed flag stops a racing reconnect from creating a new one. FileBasedTrustListManager starts a watcher thread, so closing it matters. FileBasedCertificateQuarantine holds no resources. If createAndInitialize throws, nothing has been created yet that needs closing.
  • trustAllCertificates carries "security": "insecure:ssl" in the generated JSON, and SecurityUtils is regenerated. The catalog JSON and doc copies match the sources for both milo-client and milo-browse. The DSL factories are regenerated.
  • ServerCertificateValidationTest runs end to end against a server that only offers Basic256Sha256, and the user name from the URI also exercises the identity token path.

1. The doc gets the optional checks wrong (confirmed). new DefaultClientCertificateValidator(manager, quarantine) uses ValidationCheck.NO_OPTIONAL_CHECKS, which in Milo is Set.of(APPLICATION_URI):

  • The application URI check is enforced. A trusted server certificate whose SAN URI does not match the server's application URI is refused with Bad_CertificateUriInvalid. It is also not written to rejected/certs, because the quarantine only sees chain building failures. The end-to-end test only passes because it sets server.setApplicationUri("urn:eclipse:milo:test") to match TestCertificateFactory.
  • Revocation is not enforced. OpcUaCertificateRevocationChecker only logs check suppressed: certificate failed revocation check unless REVOCATION is in the set. The page tells users to put CRLs in trusted/crl and issuer/crl, so they will expect a revoked server certificate to be refused. Expiry (VALIDITY) is only logged too.

I would build the trust list validator with at least REVOCATION (for example EnumSet.of(APPLICATION_URI, REVOCATION), and VALIDITY too if you agree). Without REVOCATION_LISTS Milo uses SOFT_FAIL, so a trust list without CRLs behaves as it does now. Whatever set you pick, please describe it exactly in the doc and say that a certificate failing the application URI check is not written to rejected/certs.

2. How a failure shows to the user. A missing trust configuration and a rejected certificate both end in LOG.info("Failed to connect", e) in performAndEvalConnect, followed by a reconnect every 10 s. A producer gets IllegalStateException("No connected") and a consumer receives nothing. So the clear message from validatorFor and Milo's Bad_CertificateUntrusted only show at INFO, with a stack trace every 10 s. JIRA asks for a clear failure. I would log these at WARN: the IllegalStateException from validatorFor, and a UaException with a certificate or security status code. If you can, also carry the last connect failure as the cause of the "No connected" exception, so a producer sees the reason. The upgrade guide should then name the symptom ("the client logs a WARN ... and does not connect").

3. The negative end-to-end cases pass for any failure. notConfigured and emptyTrustList assert that no message arrives within 5 s. That also holds if the client fails for an unrelated reason, such as a wrong key store password. emptyTrustList is backed by the rejected/certs check. notConfigured has nothing behind it apart from the unit test. This is the same gap as the mina mismatch test on #27770. If you do the "No connected" cause from point 2, a producer to the secured server can assert the message. Otherwise a log capture works.

Nit: trustListRejectsAndKeepsUntrustedServerCertificate could assert StatusCodes.Bad_CertificateUntrusted on the UaException, not just the type.

CI is still running.

Checked against the project conventions in CLAUDE.md. This is a rules-and-conventions review and does not replace CodeRabbit, Sourcery or SonarCloud.

Claude Code on behalf of @davsclaus.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

Comment thread components/camel-milo/src/main/docs/milo-client-component.adoc Outdated
Comment thread docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc Outdated

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security fix for MITM vulnerability in camel-milo — solid work overall. The concurrency model in ServerCertificateTrust is sound, test coverage across all five trust configurations is thorough, and the upgrade guide entry clearly describes the breaking change and migration path.

One medium-severity concern on the cache ID implementation worth discussing before merge.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@gnodet gnodet added the lts label Oct 14, 2026
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

🧪 CI tested the following changed modules:

  • catalog/camel-catalog
  • components/camel-milo
  • core/camel-util
  • docs
  • dsl/camel-componentdsl
  • dsl/camel-endpointdsl

ℹ️ Dependent modules were not tested because the total number of affected modules exceeded the threshold (50). Use the test-dependents label to force testing all dependents.


🔬 Scalpel shadow comparison — Scalpel: 581 of 705 tested, 24 compile-only — current: 581 all tested

Maveniverse Scalpel detected 581 affected modules (current approach: 581).

Skip-tests mode would test 581 modules (6 direct + 579 downstream), skip tests for 24 (generated code, meta-modules)

Modules Scalpel would test (581)
  • archetypes ← downstream of org.apache.camel:camel-support
  • camel-a2a ← downstream of org.apache.camel:camel-support
  • camel-activemq ← downstream of org.apache.camel:camel-core-model
  • camel-activemq6 ← downstream of org.apache.camel:camel-core-model
  • camel-ai-observability ← downstream of org.apache.camel:camel-support
  • camel-ai-observability-api ← downstream of org.apache.camel:camel-support
  • camel-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ai-resource ← downstream of org.apache.camel:camel-support
  • camel-ai-tool ← downstream of org.apache.camel:camel-support
  • camel-alibaba-common ← downstream of org.apache.camel:camel-support
  • camel-alibaba-eventbridge ← downstream of org.apache.camel:camel-support
  • camel-alibaba-fc ← downstream of org.apache.camel:camel-support
  • camel-alibaba-kms ← downstream of org.apache.camel:camel-support
  • camel-alibaba-mns ← downstream of org.apache.camel:camel-support
  • camel-alibaba-oss ← downstream of org.apache.camel:camel-support
  • camel-alibaba-ots ← downstream of org.apache.camel:camel-support
  • camel-alibaba-parent ← downstream of org.apache.camel:camel-core-model
  • camel-alibaba-sls ← downstream of org.apache.camel:camel-support
  • camel-alibaba-sms ← downstream of org.apache.camel:camel-support
  • camel-amqp ← downstream of org.apache.camel:camel-core-model
  • camel-api ← downstream of org.apache.camel:camel-util
  • camel-api-component-maven-plugin ← downstream of org.apache.camel:camel-test-junit6
  • camel-arangodb ← downstream of org.apache.camel:camel-support
  • camel-archetype-api-component ← downstream of org.apache.camel:camel-support
  • camel-archetype-component ← downstream of org.apache.camel:camel-support
  • camel-archetype-dataformat ← downstream of org.apache.camel:camel-support
  • camel-archetype-java ← downstream of org.apache.camel:camel-support
  • camel-archetype-main ← downstream of org.apache.camel:camel-support
  • camel-as2 ← downstream of org.apache.camel:camel-support
  • camel-as2-api ← downstream of org.apache.camel:camel-util
  • camel-as2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-asn1 ← downstream of org.apache.camel:camel-support
  • camel-asterisk ← downstream of org.apache.camel:camel-support
  • camel-atmosphere-websocket ← downstream of org.apache.camel:camel-support
  • camel-atom ← downstream of org.apache.camel:camel-support
  • camel-attachments ← downstream of org.apache.camel:camel-support
  • camel-avro ← downstream of org.apache.camel:camel-support
  • camel-avro-rpc ← downstream of org.apache.camel:camel-support
  • camel-avro-rpc-jetty ← downstream of org.apache.camel:camel-api
  • camel-avro-rpc-parent ← downstream of org.apache.camel:camel-core-model
  • camel-avro-rpc-spi ← downstream of org.apache.camel:camel-core-model
  • camel-aws-bedrock ← downstream of org.apache.camel:camel-support
  • camel-aws-cloudtrail ← downstream of org.apache.camel:camel-support
  • camel-aws-common ← downstream of org.apache.camel:camel-support
  • camel-aws-config ← downstream of org.apache.camel:camel-support
  • camel-aws-parameter-store ← downstream of org.apache.camel:camel-support
  • camel-aws-parent ← downstream of org.apache.camel:camel-core-model
  • camel-aws-secrets-manager ← downstream of org.apache.camel:camel-support
  • camel-aws-security-hub ← downstream of org.apache.camel:camel-support
  • camel-aws2-athena ← downstream of org.apache.camel:camel-support
  • camel-aws2-comprehend ← downstream of org.apache.camel:camel-support
  • camel-aws2-cw ← downstream of org.apache.camel:camel-support
  • camel-aws2-ddb ← downstream of org.apache.camel:camel-support
  • camel-aws2-ec2 ← downstream of org.apache.camel:camel-support
  • camel-aws2-ecs ← downstream of org.apache.camel:camel-support
  • camel-aws2-eks ← downstream of org.apache.camel:camel-support
  • camel-aws2-eventbridge ← downstream of org.apache.camel:camel-support
  • camel-aws2-iam ← downstream of org.apache.camel:camel-support
  • camel-aws2-kinesis ← downstream of org.apache.camel:camel-support
  • camel-aws2-kms ← downstream of org.apache.camel:camel-support
  • camel-aws2-lambda ← downstream of org.apache.camel:camel-support
  • camel-aws2-mq ← downstream of org.apache.camel:camel-support
  • camel-aws2-msk ← downstream of org.apache.camel:camel-support
  • camel-aws2-polly ← downstream of org.apache.camel:camel-support
  • camel-aws2-redshift ← downstream of org.apache.camel:camel-support
  • camel-aws2-rekognition ← downstream of org.apache.camel:camel-support
  • camel-aws2-s3 ← downstream of org.apache.camel:camel-support
  • camel-aws2-s3-vectors ← downstream of org.apache.camel:camel-support
  • camel-aws2-ses ← downstream of org.apache.camel:camel-support
  • camel-aws2-sns ← downstream of org.apache.camel:camel-support
  • camel-aws2-sqs ← downstream of org.apache.camel:camel-support
  • camel-aws2-step-functions ← downstream of org.apache.camel:camel-support
  • camel-aws2-sts ← downstream of org.apache.camel:camel-support
  • camel-aws2-textract ← downstream of org.apache.camel:camel-support
  • camel-aws2-timestream ← downstream of org.apache.camel:camel-support
  • camel-aws2-transcribe ← downstream of org.apache.camel:camel-support
  • camel-aws2-translate ← downstream of org.apache.camel:camel-support
  • camel-azure-common ← downstream of org.apache.camel:camel-core-model
  • camel-azure-cosmosdb ← downstream of org.apache.camel:camel-support
  • camel-azure-eventgrid ← downstream of org.apache.camel:camel-support
  • camel-azure-eventhubs ← downstream of org.apache.camel:camel-support
  • camel-azure-files ← downstream of org.apache.camel:camel-core-model
  • camel-azure-functions ← downstream of org.apache.camel:camel-support
  • camel-azure-key-vault ← downstream of org.apache.camel:camel-support
  • camel-azure-parent ← downstream of org.apache.camel:camel-core-model
  • camel-azure-schema-registry ← downstream of org.apache.camel:camel-support
  • camel-azure-servicebus ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-blob ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-datalake ← downstream of org.apache.camel:camel-support
  • camel-azure-storage-queue ← downstream of org.apache.camel:camel-support
  • camel-barcode ← downstream of org.apache.camel:camel-support
  • camel-base ← downstream of org.apache.camel:camel-util
  • camel-base-engine ← downstream of org.apache.camel:camel-util
  • camel-base64 ← downstream of org.apache.camel:camel-support
  • camel-bean ← downstream of org.apache.camel:camel-support
  • camel-bean-validator ← downstream of org.apache.camel:camel-support
  • camel-beanio ← downstream of org.apache.camel:camel-support
  • camel-bindy ← downstream of org.apache.camel:camel-support
  • camel-bonita ← downstream of org.apache.camel:camel-support
  • camel-box ← downstream of org.apache.camel:camel-support
  • camel-box-api ← downstream of org.apache.camel:camel-api
  • camel-box-parent ← downstream of org.apache.camel:camel-core-model
  • camel-braintree ← downstream of org.apache.camel:camel-support
  • camel-browse ← downstream of org.apache.camel:camel-support
  • camel-caffeine ← downstream of org.apache.camel:camel-support
  • camel-camunda ← downstream of org.apache.camel:camel-support
  • camel-cassandraql ← downstream of org.apache.camel:camel-support
  • camel-catalog-common ← downstream of org.apache.camel:camel-support
  • camel-cbor ← downstream of org.apache.camel:camel-support
  • camel-chatscript ← downstream of org.apache.camel:camel-support
  • camel-chunk ← downstream of org.apache.camel:camel-support
  • camel-cli-connector ← downstream of org.apache.camel:camel-support
  • camel-cli-debug ← downstream of org.apache.camel:camel-cli-connector
  • camel-clickhouse ← downstream of org.apache.camel:camel-support
  • camel-clickup ← downstream of org.apache.camel:camel-support
  • camel-cloudevents ← downstream of org.apache.camel:camel-support
  • camel-cluster ← downstream of org.apache.camel:camel-util
  • camel-cm-sms ← downstream of org.apache.camel:camel-support
  • camel-coap ← downstream of org.apache.camel:camel-support
  • camel-cometd ← downstream of org.apache.camel:camel-support
  • camel-console ← downstream of org.apache.camel:camel-support
  • camel-consul ← downstream of org.apache.camel:camel-support
  • camel-controlbus ← downstream of org.apache.camel:camel-support
  • camel-core ← downstream of org.apache.camel:camel-xml-io
  • camel-core-all ← downstream of org.apache.camel:camel-util
  • camel-core-catalog ← downstream of org.apache.camel:camel-util
  • camel-core-engine ← downstream of org.apache.camel:camel-util
  • camel-core-languages ← downstream of org.apache.camel:camel-util
  • camel-core-model ← downstream of org.apache.camel:camel-util
  • camel-core-processor ← downstream of org.apache.camel:camel-util
  • camel-core-reifier ← downstream of org.apache.camel:camel-util
  • camel-core-xml ← downstream of org.apache.camel:camel-core-engine
  • camel-couchbase ← downstream of org.apache.camel:camel-support
  • camel-couchdb ← downstream of org.apache.camel:camel-support
  • camel-cron ← downstream of org.apache.camel:camel-support
  • camel-crypto ← downstream of org.apache.camel:camel-support
  • camel-crypto-pgp ← downstream of org.apache.camel:camel-support
  • camel-csv ← downstream of org.apache.camel:camel-support
  • camel-cxf-common ← downstream of org.apache.camel:camel-support
  • camel-cxf-parent ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-rest ← downstream of org.apache.camel:camel-support
  • camel-cxf-soap ← downstream of org.apache.camel:camel-support
  • camel-cxf-spring-common ← downstream of org.apache.camel:camel-support
  • camel-cxf-spring-rest ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-spring-soap ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-spring-transport ← downstream of org.apache.camel:camel-core-model
  • camel-cxf-transport ← downstream of org.apache.camel:camel-support
  • camel-cyberark-vault ← downstream of org.apache.camel:camel-support
  • camel-dapr ← downstream of org.apache.camel:camel-support
  • camel-dataformat ← downstream of org.apache.camel:camel-support
  • camel-dataset ← downstream of org.apache.camel:camel-core-model
  • camel-datasonnet ← downstream of org.apache.camel:camel-support
  • camel-dataweave ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-common ← downstream of org.apache.camel:camel-support
  • camel-debezium-common-parent ← downstream of org.apache.camel:camel-support
  • camel-debezium-db2 ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-maven-plugin ← downstream of org.apache.camel:camel-support
  • camel-debezium-mongodb ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-mysql ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-oracle ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-parent ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-postgres ← downstream of org.apache.camel:camel-core-model
  • camel-debezium-sqlserver ← downstream of org.apache.camel:camel-core-model
  • camel-debug ← downstream of org.apache.camel:camel-support
  • camel-dependencies ← downstream of org.apache.camel:sync-properties-maven-plugin
  • camel-dfdl ← downstream of org.apache.camel:camel-support
  • camel-dhis2 ← downstream of org.apache.camel:camel-support
  • camel-dhis2-api ← downstream of org.apache.camel:camel-support
  • camel-dhis2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-diagram ← downstream of org.apache.camel:camel-util
  • camel-direct ← downstream of org.apache.camel:camel-support
  • camel-disruptor ← downstream of org.apache.camel:camel-support
  • camel-djl ← downstream of org.apache.camel:camel-support
  • camel-dns ← downstream of org.apache.camel:camel-support
  • camel-docker ← downstream of org.apache.camel:camel-support
  • camel-docling ← downstream of org.apache.camel:camel-support
  • camel-drill ← downstream of org.apache.camel:camel-support
  • camel-dropbox ← downstream of org.apache.camel:camel-support
  • camel-dsl-modeline ← downstream of org.apache.camel:camel-support
  • camel-dsl-support ← downstream of org.apache.camel:camel-support
  • camel-duckdb ← downstream of org.apache.camel:camel-support
  • camel-dynamic-router ← downstream of org.apache.camel:camel-support
  • camel-ehcache ← downstream of org.apache.camel:camel-support
  • camel-eip-documentation-enricher-maven-plugin ← downstream of org.apache.camel:camel-util
  • camel-elasticsearch ← downstream of org.apache.camel:camel-support
  • camel-elasticsearch-rest-client ← downstream of org.apache.camel:camel-support
  • camel-event ← downstream of org.apache.camel:camel-support
  • camel-exec ← downstream of org.apache.camel:camel-support
  • camel-fastjson ← downstream of org.apache.camel:camel-support
  • camel-fhir ← downstream of org.apache.camel:camel-support
  • camel-fhir-api ← downstream of org.apache.camel:camel-support
  • camel-fhir-parent ← downstream of org.apache.camel:camel-core-model
  • camel-file ← downstream of org.apache.camel:camel-support
  • camel-file-watch ← downstream of org.apache.camel:camel-support
  • camel-flatpack ← downstream of org.apache.camel:camel-core-model
  • camel-flink ← downstream of org.apache.camel:camel-support
  • camel-flowable ← downstream of org.apache.camel:camel-support
  • camel-fop ← downstream of org.apache.camel:camel-support
  • camel-fory ← downstream of org.apache.camel:camel-support
  • camel-freemarker ← downstream of org.apache.camel:camel-support
  • camel-ftp ← downstream of org.apache.camel:camel-core-model
  • camel-ftp-common ← downstream of org.apache.camel:camel-core-model
  • camel-geocoder ← downstream of org.apache.camel:camel-support
  • camel-git ← downstream of org.apache.camel:camel-support
  • camel-github2 ← downstream of org.apache.camel:camel-support
  • camel-google-bigquery ← downstream of org.apache.camel:camel-support
  • camel-google-calendar ← downstream of org.apache.camel:camel-support
  • camel-google-common ← downstream of org.apache.camel:camel-support
  • camel-google-drive ← downstream of org.apache.camel:camel-support
  • camel-google-firestore ← downstream of org.apache.camel:camel-support
  • camel-google-functions ← downstream of org.apache.camel:camel-support
  • camel-google-mail ← downstream of org.apache.camel:camel-support
  • camel-google-parent ← downstream of org.apache.camel:camel-core-model
  • camel-google-pubsub ← downstream of org.apache.camel:camel-support
  • camel-google-secret-manager ← downstream of org.apache.camel:camel-support
  • camel-google-sheets ← downstream of org.apache.camel:camel-support
  • camel-google-speech-to-text ← downstream of org.apache.camel:camel-support
  • camel-google-storage ← downstream of org.apache.camel:camel-support
  • camel-google-text-to-speech ← downstream of org.apache.camel:camel-support
  • camel-google-vertexai ← downstream of org.apache.camel:camel-support
  • camel-google-vision ← downstream of org.apache.camel:camel-support
  • camel-graphql ← downstream of org.apache.camel:camel-support
  • camel-grok ← downstream of org.apache.camel:camel-support
  • camel-groovy ← downstream of org.apache.camel:camel-support
  • camel-grpc ← downstream of org.apache.camel:camel-support
  • camel-gson ← downstream of org.apache.camel:camel-support
  • camel-hashicorp-vault ← downstream of org.apache.camel:camel-support
  • camel-hazelcast ← downstream of org.apache.camel:camel-support
  • camel-health ← downstream of org.apache.camel:camel-util
  • camel-hivemq ← downstream of org.apache.camel:camel-support
  • camel-hl7 ← downstream of org.apache.camel:camel-core-model
  • camel-http ← downstream of org.apache.camel:camel-core-model
  • camel-http-base ← downstream of org.apache.camel:camel-support
  • camel-http-common ← downstream of org.apache.camel:camel-support
  • camel-huawei-parent ← downstream of org.apache.camel:camel-core-model
  • camel-huaweicloud-common ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-dms ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-frs ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-functiongraph ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-iam ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-imagerecognition ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-obs ← downstream of org.apache.camel:camel-support
  • camel-huaweicloud-smn ← downstream of org.apache.camel:camel-support
  • camel-huggingface ← downstream of org.apache.camel:camel-support
  • camel-ibm-cos ← downstream of org.apache.camel:camel-support
  • camel-ibm-parent ← downstream of org.apache.camel:camel-core-model
  • camel-ibm-secrets-manager ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-discovery ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-language ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-speech-to-text ← downstream of org.apache.camel:camel-support
  • camel-ibm-watson-text-to-speech ← downstream of org.apache.camel:camel-support
  • camel-ibm-watsonx-ai ← downstream of org.apache.camel:camel-support
  • camel-ibm-watsonx-data ← downstream of org.apache.camel:camel-support
  • camel-ical ← downstream of org.apache.camel:camel-support
  • camel-iggy ← downstream of org.apache.camel:camel-support
  • camel-ignite ← downstream of org.apache.camel:camel-support
  • camel-infinispan ← downstream of org.apache.camel:camel-core-model
  • camel-infinispan-common ← downstream of org.apache.camel:camel-support
  • camel-infinispan-embedded ← downstream of org.apache.camel:camel-core-model
  • camel-infinispan-parent ← downstream of org.apache.camel:camel-core-model
  • camel-influxdb ← downstream of org.apache.camel:camel-support
  • camel-influxdb2 ← downstream of org.apache.camel:camel-support
  • camel-iso8583 ← downstream of org.apache.camel:camel-support
  • camel-jackson ← downstream of org.apache.camel:camel-core-model
  • camel-jackson-avro ← downstream of org.apache.camel:camel-support
  • camel-jackson-protobuf ← downstream of org.apache.camel:camel-support
  • camel-jackson3 ← downstream of org.apache.camel:camel-core-model
  • camel-jackson3-avro ← downstream of org.apache.camel:camel-support
  • camel-jackson3-protobuf ← downstream of org.apache.camel:camel-support
  • camel-jackson3xml ← downstream of org.apache.camel:camel-support
  • camel-jacksonxml ← downstream of org.apache.camel:camel-support
  • camel-jactl ← downstream of org.apache.camel:camel-support
  • camel-jandex ← downstream of org.apache.camel:camel-support
  • camel-jasypt ← downstream of org.apache.camel:camel-base
  • camel-java-io ← downstream of org.apache.camel:camel-xml-io
  • camel-java-joor-dsl ← downstream of org.apache.camel:camel-core-languages
  • camel-javascript ← downstream of org.apache.camel:camel-support
  • camel-jaxb ← downstream of org.apache.camel:camel-core-model
  • camel-jbang-console ← downstream of org.apache.camel:camel-support
  • camel-jbang-mcp ← downstream of org.apache.camel:camel-catalog
  • camel-jbang-plugin-mcp ← downstream of org.apache.camel:camel-jbang-core
  • camel-jbang-plugin-tui ← downstream of org.apache.camel:camel-catalog
  • camel-jbang-plugin-validate ← downstream of org.apache.camel:camel-yaml-dsl-validator
  • camel-jcache ← downstream of org.apache.camel:camel-support
  • camel-jcr ← downstream of org.apache.camel:camel-support
  • camel-jdbc ← downstream of org.apache.camel:camel-support
  • camel-jetty ← downstream of org.apache.camel:camel-support
  • camel-jetty-common ← downstream of org.apache.camel:camel-core-model
  • camel-jfr ← downstream of org.apache.camel:camel-support
  • camel-jgroups ← downstream of org.apache.camel:camel-support
  • camel-jgroups-raft ← downstream of org.apache.camel:camel-support
  • camel-jira ← downstream of org.apache.camel:camel-support
  • camel-jms ← downstream of org.apache.camel:camel-support
  • camel-jmx ← downstream of org.apache.camel:camel-support
  • camel-jolt ← downstream of org.apache.camel:camel-support
  • camel-jooq ← downstream of org.apache.camel:camel-support
  • camel-joor ← downstream of org.apache.camel:camel-support
  • camel-jpa ← downstream of org.apache.camel:camel-support
  • camel-jq ← downstream of org.apache.camel:camel-support
  • camel-jsch ← downstream of org.apache.camel:camel-core-model
  • camel-jslt ← downstream of org.apache.camel:camel-support
  • camel-json-validator ← downstream of org.apache.camel:camel-support
  • camel-jsonapi ← downstream of org.apache.camel:camel-support
  • camel-jsonata ← downstream of org.apache.camel:camel-support
  • camel-jsonb ← downstream of org.apache.camel:camel-support
  • camel-jsonpath ← downstream of org.apache.camel:camel-support
  • camel-jsoup ← downstream of org.apache.camel:camel-support
  • camel-jt400 ← downstream of org.apache.camel:camel-support
  • camel-jta ← downstream of org.apache.camel:camel-support
  • camel-jte ← downstream of org.apache.camel:camel-support
  • camel-kafka ← downstream of org.apache.camel:camel-support
  • camel-kafka-common ← downstream of org.apache.camel:camel-support
  • camel-kafka-share ← downstream of org.apache.camel:camel-support
  • camel-kamelet ← downstream of org.apache.camel:camel-core-model
  • camel-kamelet-main-support ← downstream of org.apache.camel:camel-main
  • camel-keycloak ← downstream of org.apache.camel:camel-support
  • camel-knative ← downstream of org.apache.camel:camel-support
  • camel-knative-api ← downstream of org.apache.camel:camel-support
  • camel-knative-http ← downstream of org.apache.camel:camel-core-model
  • camel-knative-parent ← downstream of org.apache.camel:camel-core-model
  • camel-kserve ← downstream of org.apache.camel:camel-support
  • camel-kubernetes ← downstream of org.apache.camel:camel-support
  • camel-kudu ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-agent ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-agent-api ← downstream of org.apache.camel:camel-api
  • camel-langchain4j-chat ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-core ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddings ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddingstore ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-embeddingstore-api ← downstream of org.apache.camel:camel-api
  • camel-langchain4j-ingest ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-tokenizer ← downstream of org.apache.camel:camel-support
  • camel-langchain4j-web-search ← downstream of org.apache.camel:camel-support
  • camel-language ← downstream of org.apache.camel:camel-support
  • camel-launcher-container ← downstream of org.apache.camel:camel-launcher
  • camel-ldap ← downstream of org.apache.camel:camel-support
  • camel-ldif ← downstream of org.apache.camel:camel-support
  • camel-log ← downstream of org.apache.camel:camel-support
  • camel-lra ← downstream of org.apache.camel:camel-core-model
  • camel-lucene ← downstream of org.apache.camel:camel-support
  • camel-lumberjack ← downstream of org.apache.camel:camel-support
  • camel-lzf ← downstream of org.apache.camel:camel-support
  • camel-mail ← downstream of org.apache.camel:camel-support
  • camel-mail-microsoft-oauth ← downstream of org.apache.camel:camel-core-model
  • camel-main ← downstream of org.apache.camel:camel-util
  • camel-management ← downstream of org.apache.camel:camel-xml-io
  • camel-management-api ← downstream of org.apache.camel:camel-util
  • camel-mapstruct ← downstream of org.apache.camel:camel-support
  • camel-master ← downstream of org.apache.camel:camel-support
  • camel-maven-plugin ← downstream of org.apache.camel:camel-spring-main
  • camel-mcp-server ← downstream of org.apache.camel:camel-core-model
  • camel-mcp-server-api ← downstream of org.apache.camel:camel-support
  • camel-mdc ← downstream of org.apache.camel:camel-support
  • camel-metrics ← downstream of org.apache.camel:camel-support
  • camel-micrometer ← downstream of org.apache.camel:camel-support
  • camel-micrometer-observability ← downstream of org.apache.camel:camel-core-model
  • camel-micrometer-prometheus ← downstream of org.apache.camel:camel-core-model
  • camel-microprofile-config ← downstream of org.apache.camel:camel-support
  • camel-microprofile-fault-tolerance ← downstream of org.apache.camel:camel-support
  • camel-microprofile-health ← downstream of org.apache.camel:camel-core-model
  • camel-microprofile-parent ← downstream of org.apache.camel:camel-core-model
  • camel-milo ← components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseComponentConfigurer.java, components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointConfigurer.java, components/camel-milo/src/generated/java/org/apache/camel/component/milo/browse/MiloBrowseEndpointUriFactory.java, components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientComponentConfigurer.java, components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointConfigurer.java, components/camel-milo/src/generated/java/org/apache/camel/component/milo/client/MiloClientEndpointUriFactory.java, components/camel-milo/src/generated/resources/META-INF/org/apache/camel/component/milo/browse/milo-browse.json, components/camel-milo/src/generated/resources/META-INF/org/apache/camel/component/milo/client/milo-client.json, components/camel-milo/src/main/docs/milo-browse-component.adoc, components/camel-milo/src/main/docs/milo-client-component.adoc, components/camel-milo/src/main/java/org/apache/camel/component/milo/client/MiloClientConfiguration.java, components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/ServerCertificateTrust.java, components/camel-milo/src/main/java/org/apache/camel/component/milo/client/internal/SubscriptionManager.java, components/camel-milo/src/test/java/org/apache/camel/component/milo/ServerCertificateValidationTest.java, components/camel-milo/src/test/java/org/apache/camel/component/milo/client/MiloClientConfigurationTest.java, components/camel-milo/src/test/java/org/apache/camel/component/milo/client/internal/ServerCertificateTrustTest.java, components/camel-milo/src/test/java/org/apache/camel/component/milo/client/internal/TestPki.java
  • camel-milvus ← downstream of org.apache.camel:camel-support
  • camel-mina ← downstream of org.apache.camel:camel-support
  • camel-mina-sftp ← downstream of org.apache.camel:camel-core-model
  • camel-minio ← downstream of org.apache.camel:camel-support
  • camel-mllp ← downstream of org.apache.camel:camel-support
  • camel-mock ← downstream of org.apache.camel:camel-support
  • camel-mongodb ← downstream of org.apache.camel:camel-support
  • camel-mongodb-gridfs ← downstream of org.apache.camel:camel-support
  • camel-mustache ← downstream of org.apache.camel:camel-support
  • camel-mvel ← downstream of org.apache.camel:camel-support
  • camel-mybatis ← downstream of org.apache.camel:camel-core-model
  • camel-nats ← downstream of org.apache.camel:camel-support
  • camel-neo4j ← downstream of org.apache.camel:camel-support
  • camel-netty ← downstream of org.apache.camel:camel-support
  • camel-netty-http ← downstream of org.apache.camel:camel-core-model
  • camel-oaipmh ← downstream of org.apache.camel:camel-support
  • camel-oauth ← downstream of org.apache.camel:camel-support
  • camel-observability-services ← downstream of org.apache.camel:camel-core-model
  • camel-observation ← downstream of org.apache.camel:camel-support
  • camel-ocsf ← downstream of org.apache.camel:camel-support
  • camel-odata ← downstream of org.apache.camel:camel-support
  • camel-ognl ← downstream of org.apache.camel:camel-support
  • camel-olingo2 ← downstream of org.apache.camel:camel-support
  • camel-olingo2-api ← downstream of org.apache.camel:camel-core-model
  • camel-olingo2-parent ← downstream of org.apache.camel:camel-core-model
  • camel-olingo4 ← downstream of org.apache.camel:camel-support
  • camel-olingo4-api ← downstream of org.apache.camel:camel-support
  • camel-olingo4-parent ← downstream of org.apache.camel:camel-core-model
  • camel-once ← downstream of org.apache.camel:camel-support
  • camel-opa ← downstream of org.apache.camel:camel-support
  • camel-openai ← downstream of org.apache.camel:camel-support
  • camel-openapi-java ← downstream of org.apache.camel:camel-core-model
  • camel-openapi-rest-dsl-generator ← downstream of org.apache.camel:camel-util
  • camel-openapi-validator ← downstream of org.apache.camel:camel-core-model
  • camel-openfeature ← downstream of org.apache.camel:camel-support
  • camel-openfga ← downstream of org.apache.camel:camel-support
  • camel-opensearch ← downstream of org.apache.camel:camel-support
  • camel-openstack ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry-metrics ← downstream of org.apache.camel:camel-support
  • camel-opentelemetry2 ← downstream of org.apache.camel:camel-core-model
  • camel-optaplanner ← downstream of org.apache.camel:camel-support
  • camel-paho ← downstream of org.apache.camel:camel-support
  • camel-paho-mqtt5 ← downstream of org.apache.camel:camel-support
  • camel-parquet-avro ← downstream of org.apache.camel:camel-support
  • camel-pdf ← downstream of org.apache.camel:camel-support
  • camel-pg-replication-slot ← downstream of org.apache.camel:camel-support
  • camel-pgevent ← downstream of org.apache.camel:camel-support
  • camel-pgvector ← downstream of org.apache.camel:camel-support
  • camel-pinecone ← downstream of org.apache.camel:camel-support
  • camel-platform-http ← downstream of org.apache.camel:camel-core-model
  • camel-platform-http-jolokia ← downstream of org.apache.camel:camel-support
  • camel-platform-http-main ← downstream of org.apache.camel:camel-core-model
  • camel-platform-http-vertx ← downstream of org.apache.camel:camel-core-model
  • camel-plc4x ← downstream of org.apache.camel:camel-support
  • camel-pqc ← downstream of org.apache.camel:camel-support
  • camel-printer ← downstream of org.apache.camel:camel-support
  • camel-protobuf ← downstream of org.apache.camel:camel-support
  • camel-pubnub ← downstream of org.apache.camel:camel-support
  • camel-pulsar ← downstream of org.apache.camel:camel-support
  • camel-python ← downstream of org.apache.camel:camel-support
  • camel-python3 ← downstream of org.apache.camel:camel-support
  • camel-qdrant ← downstream of org.apache.camel:camel-support
  • camel-quartz ← downstream of org.apache.camel:camel-support
  • camel-quickfix ← downstream of org.apache.camel:camel-support
  • camel-quickjs ← downstream of org.apache.camel:camel-support
  • camel-reactive-streams ← downstream of org.apache.camel:camel-core-model
  • camel-reactor ← downstream of org.apache.camel:camel-support
  • camel-redis ← downstream of org.apache.camel:camel-support
  • camel-ref ← downstream of org.apache.camel:camel-support
  • camel-resilience4j ← downstream of org.apache.camel:camel-support
  • camel-resilience4j-micrometer ← downstream of org.apache.camel:camel-core-model
  • camel-resourceresolver-github ← downstream of org.apache.camel:camel-support
  • camel-rest ← downstream of org.apache.camel:camel-support
  • camel-rest-openapi ← downstream of org.apache.camel:camel-support
  • camel-rest-postman ← downstream of org.apache.camel:camel-support
  • camel-restdsl-openapi-plugin ← downstream of org.apache.camel:camel-core-engine
  • camel-robotframework ← downstream of org.apache.camel:camel-support
  • camel-rocketmq ← downstream of org.apache.camel:camel-support
  • camel-rss ← downstream of org.apache.camel:camel-support
  • camel-rxjava ← downstream of org.apache.camel:camel-support
  • camel-saga ← downstream of org.apache.camel:camel-support
  • camel-salesforce ← downstream of org.apache.camel:camel-core-model
  • camel-salesforce-codegen ← downstream of org.apache.camel:camel-core-model
  • camel-salesforce-parent ← downstream of org.apache.camel:camel-core-model
  • camel-sap-netweaver ← downstream of org.apache.camel:camel-support
  • camel-saxon ← downstream of org.apache.camel:camel-core-model
  • camel-scheduler ← downstream of org.apache.camel:camel-support
  • camel-schematron ← downstream of org.apache.camel:camel-support
  • camel-seda ← downstream of org.apache.camel:camel-support
  • camel-semantic ← downstream of org.apache.camel:camel-support
  • camel-semantic-openai ← downstream of org.apache.camel:camel-core-model
  • camel-semantic-typesafe-ai ← downstream of org.apache.camel:camel-core-model
  • camel-semantic-wolf-defender ← downstream of org.apache.camel:camel-support
  • camel-servicenow ← downstream of org.apache.camel:camel-support
  • camel-servicenow-maven-plugin ← downstream of org.apache.camel:camel-core-model
  • camel-servicenow-parent ← downstream of org.apache.camel:camel-core-model
  • camel-servlet ← downstream of org.apache.camel:camel-support
  • camel-shell ← downstream of org.apache.camel:camel-support
  • camel-shiro ← downstream of org.apache.camel:camel-support
  • camel-sjms ← downstream of org.apache.camel:camel-support
  • camel-sjms2 ← downstream of org.apache.camel:camel-support
  • camel-slack ← downstream of org.apache.camel:camel-support
  • camel-smb ← downstream of org.apache.camel:camel-support
  • camel-smooks ← downstream of org.apache.camel:camel-support
  • camel-smpp ← downstream of org.apache.camel:camel-support
  • camel-snakeyaml ← downstream of org.apache.camel:camel-support
  • camel-snmp ← downstream of org.apache.camel:camel-support
  • camel-soap ← downstream of org.apache.camel:camel-support
  • camel-solr ← downstream of org.apache.camel:camel-support
  • camel-spiffe ← downstream of org.apache.camel:camel-support
  • camel-splunk-hec ← downstream of org.apache.camel:camel-support
  • camel-spring ← downstream of org.apache.camel:camel-management-api
  • camel-spring-ai-chat ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-embeddings ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-image ← downstream of org.apache.camel:camel-support
  • camel-spring-ai-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ai-vector-store ← downstream of org.apache.camel:camel-support
  • camel-spring-batch ← downstream of org.apache.camel:camel-support
  • camel-spring-cloud-config ← downstream of org.apache.camel:camel-support
  • camel-spring-jdbc ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ldap ← downstream of org.apache.camel:camel-support
  • camel-spring-main ← downstream of org.apache.camel:camel-core-model
  • camel-spring-parent ← downstream of org.apache.camel:camel-core-model
  • camel-spring-rabbitmq ← downstream of org.apache.camel:camel-support
  • camel-spring-redis ← downstream of org.apache.camel:camel-support
  • camel-spring-security ← downstream of org.apache.camel:camel-core-model
  • camel-spring-ws ← downstream of org.apache.camel:camel-support
  • camel-spring-xml ← downstream of org.apache.camel:camel-core-model
  • camel-sql ← downstream of org.apache.camel:camel-support
  • camel-ssh ← downstream of org.apache.camel:camel-support
  • camel-state-store ← downstream of org.apache.camel:camel-support
  • camel-state-store-parent ← downstream of org.apache.camel:camel-core-model
  • camel-stax ← downstream of org.apache.camel:camel-support
  • camel-stitch ← downstream of org.apache.camel:camel-support
  • camel-stream ← downstream of org.apache.camel:camel-support
  • camel-streamcaching-test ← downstream of org.apache.camel:camel-test-junit6
  • camel-stringtemplate ← downstream of org.apache.camel:camel-support
  • camel-stripe ← downstream of org.apache.camel:camel-support
  • camel-stub ← downstream of org.apache.camel:camel-core-model
  • camel-support ← downstream of org.apache.camel:camel-util
  • camel-swift ← downstream of org.apache.camel:camel-support
  • camel-syslog ← downstream of org.apache.camel:camel-support
  • camel-tahu ← downstream of org.apache.camel:camel-api
  • camel-tarfile ← downstream of org.apache.camel:camel-core-model
  • camel-telegram ← downstream of org.apache.camel:camel-support
  • camel-telemetry ← downstream of org.apache.camel:camel-support
  • camel-telemetry-dev ← downstream of org.apache.camel:camel-core-model
  • camel-tensorflow-serving ← downstream of org.apache.camel:camel-support
  • camel-test-infra-all ← downstream of org.apache.camel:camel-test-infra-jetty
  • camel-test-infra-artemis ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-infra-cli ← downstream of org.apache.camel:camel-util
  • camel-test-infra-core ← downstream of org.apache.camel:camel-core
  • camel-test-infra-jetty ← downstream of org.apache.camel:camel-util
  • camel-test-infra-qdrant ← downstream of org.apache.camel:camel-util
  • camel-test-infra-smb ← downstream of org.apache.camel:camel-test-junit6
  • camel-test-junit5 ← downstream of org.apache.camel:camel-support
  • camel-test-junit6 ← downstream of org.apache.camel:camel-support
  • camel-test-main-junit5 ← downstream of org.apache.camel:camel-core-model
  • camel-test-main-junit6 ← downstream of org.apache.camel:camel-core-model
  • camel-test-parent ← downstream of org.apache.camel:camel-core-model
  • camel-test-spring-junit5 ← downstream of org.apache.camel:camel-core-model
  • camel-test-spring-junit6 ← downstream of org.apache.camel:camel-core-model
  • camel-thrift ← downstream of org.apache.camel:camel-support
  • camel-thymeleaf ← downstream of org.apache.camel:camel-support
  • camel-tika ← downstream of org.apache.camel:camel-support
  • camel-timer ← downstream of org.apache.camel:camel-support
  • camel-tooling-maven ← downstream of org.apache.camel:camel-support
  • camel-toon ← downstream of org.apache.camel:camel-support
  • camel-tracing ← downstream of org.apache.camel:camel-support
  • camel-twilio ← downstream of org.apache.camel:camel-support
  • camel-twitter ← downstream of org.apache.camel:camel-support
  • camel-typesafe-ai ← downstream of org.apache.camel:camel-support
  • camel-ubl ← downstream of org.apache.camel:camel-support
  • camel-undertow ← downstream of org.apache.camel:camel-support
  • camel-undertow-spring-security ← downstream of org.apache.camel:camel-core-model
  • camel-univocity-parsers ← downstream of org.apache.camel:camel-support
  • camel-util ← core/camel-util/src/main/java/org/apache/camel/util/SecurityUtils.java
  • camel-validator ← downstream of org.apache.camel:camel-support
  • camel-velocity ← downstream of org.apache.camel:camel-support
  • camel-vertx ← downstream of org.apache.camel:camel-support
  • camel-vertx-common ← downstream of org.apache.camel:camel-support
  • camel-vertx-http ← downstream of org.apache.camel:camel-core-model
  • camel-vertx-parent ← downstream of org.apache.camel:camel-core-model
  • camel-vertx-websocket ← downstream of org.apache.camel:camel-support
  • camel-wal ← downstream of org.apache.camel:camel-support
  • camel-wasm ← downstream of org.apache.camel:camel-support
  • camel-weather ← downstream of org.apache.camel:camel-support
  • camel-weaviate ← downstream of org.apache.camel:camel-support
  • camel-web3j ← downstream of org.apache.camel:camel-support
  • camel-webhook ← downstream of org.apache.camel:camel-support
  • camel-whatsapp ← downstream of org.apache.camel:camel-support
  • camel-wordpress ← downstream of org.apache.camel:camel-support
  • camel-workday ← downstream of org.apache.camel:camel-support
  • camel-xchange ← downstream of org.apache.camel:camel-support
  • camel-xj ← downstream of org.apache.camel:camel-core-model
  • camel-xml-io ← downstream of org.apache.camel:camel-util
  • camel-xml-io-dsl ← downstream of org.apache.camel:camel-xml-io
  • camel-xml-jaxb ← downstream of org.apache.camel:camel-util
  • camel-xml-jaxb-dsl ← downstream of org.apache.camel:camel-core-languages
  • camel-xml-jaxb-dsl-test-definition ← downstream of org.apache.camel:camel-support
  • camel-xml-jaxb-dsl-test-spring ← downstream of org.apache.camel:camel-support
  • camel-xml-jaxp ← downstream of org.apache.camel:camel-util
  • camel-xmlsecurity ← downstream of org.apache.camel:camel-support
  • camel-xmpp ← downstream of org.apache.camel:camel-support
  • camel-xpath ← downstream of org.apache.camel:camel-support
  • camel-xslt ← downstream of org.apache.camel:camel-support
  • camel-xslt-saxon ← downstream of org.apache.camel:camel-core-model
  • camel-yaml-dsl-common ← downstream of org.apache.camel:camel-core-engine
  • camel-yaml-dsl-validator ← downstream of org.apache.camel:camel-catalog
  • camel-yaml-dsl-validator-maven-plugin ← downstream of org.apache.camel:camel-yaml-dsl-validator
  • camel-yaml-io ← downstream of org.apache.camel:camel-util
  • camel-zendesk ← downstream of org.apache.camel:camel-support
  • camel-zip-deflater ← downstream of org.apache.camel:camel-support
  • camel-zipfile ← downstream of org.apache.camel:camel-support
  • camel-zookeeper ← downstream of org.apache.camel:camel-support
  • camel-zookeeper-master ← downstream of org.apache.camel:camel-support
  • components ← downstream of org.apache.camel:camel-core-model
  • sync-properties-maven-plugin ← downstream of org.apache.camel:camel-util
Modules with tests skipped (24)
  • apache-camel
  • camel-allcomponents
  • camel-catalog-console
  • camel-catalog-maven
  • camel-catalog-suggest
  • camel-endpointdsl-support
  • camel-itest
  • camel-jbang-core
  • camel-jbang-it
  • camel-jbang-main
  • camel-jbang-plugin-edit
  • camel-jbang-plugin-generate
  • camel-jbang-plugin-kubernetes
  • camel-jbang-plugin-test
  • camel-kamelet-main
  • camel-launcher
  • camel-report-maven-plugin
  • camel-route-parser
  • camel-salesforce-maven-plugin
  • camel-yaml-dsl
  • camel-yaml-dsl-deserializers
  • camel-yaml-dsl-maven-plugin
  • coverage
  • dummy-component

ℹ️ Shadow mode — Scalpel observes but does not affect test execution. Learn more

Build reactor — dependencies compiled but only changed modules were tested (6 modules, 1m 53s total)

Total reactor time: 1m 53s

Module Duration Status
Camel :: Component DSL 55.1s SUCCESS
Camel :: Catalog :: Camel Catalog 25.8s SUCCESS
Camel :: Docs 18.6s SUCCESS
Camel :: Util 13.3s SUCCESS
Camel :: Endpoint DSL n/a
Camel :: Milo n/a

Top 20 slowest modules:

  • Camel :: Component DSL (55.1s)
  • Camel :: Catalog :: Camel Catalog (25.8s)
  • Camel :: Docs (18.6s)
  • Camel :: Util (13.3s)

⚙️ View full build and test results

@oscerd

oscerd commented Oct 15, 2026

Copy link
Copy Markdown
Contributor Author

@davsclaus on the nit about Bad_CertificateUntrusted: in Milo 1.1.8 a certificate without a chain up to a trusted certificate is refused with Bad_SecurityChecksFailed ("unable to find valid certification path to requested target"), not Bad_CertificateUntrusted. So trustListRejectsAndKeepsUntrustedServerCertificate now asserts that status code (0b7c25a).

Claude Code on behalf of Andrea Cosentino

@github-actions github-actions Bot removed the lts label Oct 15, 2026

@gnodet-bot gnodet-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Following up on my earlier review — all five previous findings have been addressed.

  • Finding 1 (cache ID collision risk) — ✅ addressed. Cache ID now uses className@identityHashCode, matching Java's Object.toString() convention. The option Javadoc explicitly states that endpoints share a connection only when they use the same validator instance, so the semantic expectation is clear.
  • Finding A (doc + optional checks) — ✅ addressed. TRUST_LIST_CHECKS now includes APPLICATION_URI, VALIDITY, and REVOCATION. The doc accurately lists what is enforced vs. only logged, and five new unit tests exercise each check with specific StatusCode assertions (Bad_CertificateRevoked, Bad_CertificateRevocationUnknown, Bad_CertificateTimeInvalid, Bad_CertificateUriInvalid).
  • Finding B (WARN log + cause chain) — ✅ addressed. NotConfiguredException and UaException with certificate status codes log at WARN via logConnectFailure(). The last connect failure is now carried as the cause of the IllegalStateException("No connected").
  • Finding C (negative test reason assertions) — ✅ addressed. assertConnectionFailure() asserts both "No connected" and the expected reason string in the cause chain.
  • Finding D (upgrade guide symptom) — ✅ addressed. The guide now names the WARN message text, retry interval, and producer failure with cause.

One minor observation: handleConnectionFailure() (the subscription reconnect path) still logs at INFO unconditionally, while logConnectFailure() (the initial connect path) uses WARN for certificate failures. This is acceptable — subscription reconnect failures are operational events where the root cause is typically the lost connection, not a configuration error. The initial connect already emitted the WARN. Not a blocker.

This review was generated by an AI agent, Hermès on behalf of @gnodet.

@oscerd

oscerd commented Oct 15, 2026

Copy link
Copy Markdown
Contributor Author

@gnodet-bot thanks for the follow-up. On the handleConnectionFailure() observation: that INFO line reports the loss of an established connection. The reconnect it triggers goes through connect() and performAndEvalConnect(), so if the server certificate cannot be validated at that point, logConnectFailure() still logs it at WARN.

Claude Code on behalf of Andrea Cosentino

@oscerd
oscerd requested a review from davsclaus October 15, 2026 10:04

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @oscerd. I compared 487e7dd..0b7c25a (the rebase left the first commit unchanged, so the new work is in 0b7c25a) and went through my earlier points:

  • Optional checks: fixed in the code. The trust list validator uses APPLICATION_URI, VALIDITY and REVOCATION, and the new unit tests assert the exact status codes. I checked Milo 1.1.8: only a chain-building failure goes to rejected/certs, so that part of the doc is right. One sentence is still wrong, see below.
  • WARN and cause: fixed. A missing trust configuration and a certificate or security status code are logged at WARN as one line, with the stack trace at DEBUG. The last connect failure is the cause of No connected and is cleared after a successful connect.
  • Negative end-to-end cases: fixed. assertConnectionFailure checks No connected and the reason for the not-configured and empty-trust-list clients.
  • Upgrade guide symptom: fixed, it names the WARN text, the 10 s retry and the producer failure.
  • Bad_CertificateUntrusted nit: answered. Milo 1.1.8 throws Bad_SecurityChecksFailed when no chain can be built.
  • @gnodet-bot's cache id point: fixed. The id uses the class name, and the javadoc says connections are shared only for the same validator instance.

New finding: the doc and the upgrade guide disagree with the code about a CA without a CRL. milo-client-component.adoc says that without a revocation list for an issuer the revocation status is not checked. Your test trustListRefusesServerCertificateOfCaWithoutRevocationList, the TRUST_LIST_CHECKS javadoc and your reply on the thread say the opposite: a CA-issued certificate is refused with Bad_CertificateRevocationUnknown. The upgrade guide does not mention it, and someone upgrading with a CA-issued server certificate will hit it. (Milo's own revocation checker, which applies SOFT_FAIL, needs reflective access to sun.security.provider.certpath; on JDK 17+ without --add-opens Milo falls back to the JDK checker without SOFT_FAIL, which is probably where the sentence came from.) Requiring the CRL is fine with me, as OPC UA asks for it. Please describe it in the doc, the trustListDirectory javadoc and the upgrade guide, and regenerate the catalog copy, the JSON and the DSL (suggestions inline).

CI is green.

Claude Code on behalf of @davsclaus.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

Comment thread components/camel-milo/src/main/docs/milo-client-component.adoc Outdated
Comment thread docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc Outdated
@oscerd
oscerd requested a review from davsclaus October 15, 2026 11:53

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @oscerd. I compared 0b7c25a..999fd74 (the rebase left both earlier commits unchanged, so the new work is in 999fd74) and went through my earlier points:

  • The revocation sentence in milo-client-component.adoc is fixed. It now says that a CA-issued certificate without a CRL of its CA is refused with Bad_CertificateRevocationUnknown (as trustListRefusesServerCertificateOfCaWithoutRevocationList checks), that an empty CRL is enough (trustListAcceptsServerCertificateOfCaWithRevocationList), and that a self-signed certificate of the trust list is not checked (trustListAcceptsTrustedServerCertificate).
  • The setTrustListDirectory javadoc says the same, and the JSON, the catalog doc copy and the DSL factories are regenerated.
  • The 4.24 upgrade guide tells users with a CA-issued server certificate to add the CRL of the CA to trusted/crl or issuer/crl.
  • The earlier checks (APPLICATION_URI, VALIDITY, REVOCATION) are still in place.

No new findings. One thing before merge: #27780 (CAMEL-25566) has since added options to milo-client on main, so the branch now conflicts in the generated milo-client.json (component and catalog) and MiloClientEndpointUriFactory.java. Please rebase and regenerate.

CI is green on 999fd74.

Claude Code on behalf of @davsclaus.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

oscerd and others added 4 commits October 15, 2026 17:54
…ertificate against a trust list

milo-client and milo-browse kept the default certificate validator of the
Eclipse Milo client configuration, which accepts any server certificate, and
had no option to configure trust material.

The client now validates the server certificate whenever the selected
endpoint uses a security policy other than None, with the trust list in
trustListDirectory or the validator in certificateValidator, and does not
connect when neither is configured. The new trustAllCertificates option,
marked insecure:ssl, accepts any server certificate. The same validator
checks the certificate that the user identity token is encrypted with.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
The trust list validator checks the application URI, the validity period
and the revocation status of the server certificate. As OPC UA requires, a
certificate issued by a CA needs a revocation list of that CA in the trust
list. The documentation describes these checks exactly.

A missing trust configuration and a failed certificate or security check
are logged at WARN, and the last connection failure is the cause of the
"No connected" exception that a producer gets. The end-to-end test asserts
that reason, and the unit tests cover revoked, expired, CA without
revocation list and application URI cases. The connection cache id uses
the class name of a custom validator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
… the trust list

A server certificate issued by a CA is refused with
Bad_CertificateRevocationUnknown when the trust list holds no revocation list
of that CA. The component documentation, the option description and the
upgrade guide said the opposite, and now describe this requirement.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Andrea Cosentino <ancosen@gmail.com>
The milo-client endpoint metadata now holds both the options added by
CAMEL-25566 and the server certificate trust options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Andrea Cosentino <ancosen@gmail.com>

@davsclaus davsclaus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code on behalf of davsclaus

Thanks @oscerd for the rebase. I compared what the PR changes before (999fd74 on 6463f13) and after (31d9e32 on a16cccb), file by file:

  • 24 of the 27 files change exactly as before, including SubscriptionManager, ServerCertificateTrust, MiloClientConfiguration, the tests, the docs and the 4.24 upgrade guide.
  • Only the three files that conflicted with #27780 (CAMEL-25566) differ: milo-client.json (component and catalog) and MiloClientEndpointUriFactory.java. They now hold the options from both PRs. The indexes are renumbered, trustAllCertificates still carries "security": "insecure:ssl", and the catalog JSON and doc copy match the sources. monitorNodes and the trust list options are both in the endpoint DSL and the configurer.
  • In SubscriptionManager, the trust list changes sit next to the PendingValue delivery from #27780 without overlapping. Connect and validator wiring are as I approved them.

All earlier threads are resolved. No new findings. CI was still running on 31d9e32 when I looked, so please merge once it is green.

Checked against the project conventions in CLAUDE.md. This is a rules-and-conventions review and does not replace CodeRabbit, Sourcery or SonarCloud.

This review was generated by an AI agent and may contain inaccuracies. Please verify all suggestions before applying.

@davsclaus davsclaus added this to the 4.24.0 milestone Oct 16, 2026
@davsclaus davsclaus added the bug Something isn't working label Oct 16, 2026
@davsclaus
davsclaus merged commit 1109759 into apache:main Oct 16, 2026
7 checks passed
@etzel-mes

Copy link
Copy Markdown
Contributor

@oscerd ServerCertificateValidationTest#onlyClientsThatCanValidateTheServerCertificateConnect fails on main since this PR and #27908 were merged within a minute of each other; each was green on its own. mock:trustAll receives two messages: the Bad status of the server item that was not written yet, then Foo. Since #27908 the consumer delivers a data change with a Bad status even when its value is null, so a consumer that starts before the first write receives that status first. It failed in 3 of 3 runs here, also on main (16b6e9d).

In the tests changed by #27908 I start such routes after the first write (autoStartup(false), then startRoute). Would you like me to send that change for this test, or do you prefer to adjust it yourself?

Claude Code on behalf of etzel-mes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants