{"record":{"id":"aea3d12366f6b7d8","repo":"pinpoint-apm/pinpoint","slug":"can-t-find-sslprovider-value-providertype","errorCode":null,"errorMessage":"can't find SslProvider. value:+providerType","messagePattern":"can't find SslProvider\\. value:\\+providerType","errorType":"validation","errorClass":"SSLException","httpStatus":null,"severity":"error","filePath":"grpc/src/main/java/com/navercorp/pinpoint/grpc/security/SslContextFactory.java","lineNumber":141,"sourceCode":"        }\n\n        LOGGER.info(\"Support cipher list : {} {}\", sslContext, supportedCipherSuiteList);\n    }\n\n    SslProvider getSslProvider(String providerType) throws SSLException {\n        if (StringUtils.isEmpty(providerType)) {\n            return SslProvider.OPENSSL;\n        }\n\n        if (SslProvider.OPENSSL.name().equalsIgnoreCase(providerType)) {\n            return SslProvider.OPENSSL;\n        }\n\n        if (SslProvider.JDK.name().equalsIgnoreCase(providerType)) {\n            return SslProvider.JDK;\n        }\n\n        throw new SSLException(\"can't find SslProvider. value:\" + providerType);\n    }\n\n}","sourceCodeStart":123,"sourceCodeEnd":144,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/grpc/src/main/java/com/navercorp/pinpoint/grpc/security/SslContextFactory.java#L123-L144","documentation":"SslContextFactory.getSslProvider maps a providerType string to netty's SslProvider enum: it tries OpenSSL variants then JDK, and throws SSLException(\"can't find SslProvider. value:...\") when the string matches none. This catches configuration typos and unsupported provider names before any SSL context is built.","triggerScenarios":"Passing a providerType string (from the gRPC SSL config, e.g. client.ssl.provider.type or the collector equivalent) that is not one of the accepted values such as OPENSSL, OPENSSL_REFCNT, JDK — e.g. 'opensslSsl', 'native', or a misspelled value.","commonSituations":"Typo in properties file (case/spacing aside, equalsIgnoreCase is used for JDK/OpenSSL names so only genuinely wrong words fail); copying config from docs for a different library; value set via env var substitution that resolved to garbage.","solutions":["Set provider type to a valid value: OPENSSL, OPENSSL_REFCNT, or JDK.","Check the exact configured string for typos or stray characters (whitespace is not trimmed here).","If using OpenSSL, verify netty-tcnative/native transport is on the classpath or switch to JDK.","Log/print the resolved configuration value to confirm what the factory actually received."],"exampleFix":"// before\nclient.ssl.provider.type=openssl-native\n// after\nclient.ssl.provider.type=OPENSSL","handlingStrategy":"validation","validationCode":"String type = System.getProperty(\"client.ssl.provider.type\", \"\");\nSet<String> valid = Set.of(\"OPENSSL\", \"OPENSSL_REFCNT\", \"JDK\");\nif (!valid.contains(type.toUpperCase())) {\n    throw new IllegalArgumentException(\"provider.type must be one of \" + valid + \", got: \" + type);\n}","typeGuard":null,"tryCatchPattern":"try {\n    sslContext = SslContextFactory.create(...);\n} catch (SSLException e) {\n    if (e.getMessage().startsWith(\"can't find SslProvider\")) {\n        LOG.error(\"Bad ssl.provider.type config; falling back to JDK\", e);\n    }\n    throw e;\n}","preventionTips":["Copy provider values verbatim from documentation (OPENSSL, OPENSSL_REFCNT, JDK).","Validate config keys at startup with a schema/config check.","Avoid free-text env substitution into this field; pin the value in your deployment template."],"tags":["grpc","ssl","invalid-value","configuration"],"backgroundTag":"invalid-enum-value","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}