projectdiscovery/nuclei · error
azure connection details are missing. Please provide %s
Error message
azure connection details are missing. Please provide %s
What it means
Startup options validation (internal/runner/options.go:201) is the Azure mirror of the S3 check: when AzureContainerName is set with UpdateTemplates and -azure-template-disable-download is absent, validateMissingAzureOptions collects missing items among AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_SERVICE_URL and AZURE_CONTAINER_NAME, and the error enumerates exactly which are missing.
Source
Thrown at internal/runner/options.go:201
if options.HasClientCertificates() {
if generic.EqualsAny("", options.ClientCertFile, options.ClientKeyFile, options.ClientCAFile) {
return errors.New("if a client certification option is provided, then all three must be provided")
}
validateCertificatePaths(options.Logger, options.ClientCertFile, options.ClientKeyFile, options.ClientCAFile)
}
// Verify AWS secrets are passed if a S3 template bucket is passed
if options.AwsBucketName != "" && options.UpdateTemplates && !options.AwsTemplateDisableDownload {
missing := validateMissingS3Options(options)
if missing != nil {
return fmt.Errorf("aws s3 bucket details are missing. Please provide %s", strings.Join(missing, ","))
}
}
// Verify Azure connection configuration is passed if the Azure template bucket is passed
if options.AzureContainerName != "" && options.UpdateTemplates && !options.AzureTemplateDisableDownload {
missing := validateMissingAzureOptions(options)
if missing != nil {
return fmt.Errorf("azure connection details are missing. Please provide %s", strings.Join(missing, ","))
}
}
// Verify that all GitLab options are provided if the GitLab server or token is provided
if len(options.GitLabTemplateRepositoryIDs) != 0 && options.UpdateTemplates && !options.GitLabTemplateDisableDownload {
missing := validateMissingGitLabOptions(options)
if missing != nil {
return fmt.Errorf("gitlab server details are missing. Please provide %s", strings.Join(missing, ","))
}
}
// verify that a valid ip version type was selected (4, 6)
if len(options.IPVersion) == 0 {
// add ipv4 as default
options.IPVersion = append(options.IPVersion, "4")
}
var useIPV4, useIPV6 bool
for _, ipv := range options.IPVersion {View on GitHub (pinned to 265b3a3dec)
Solutions
- Supply all Azure settings: tenant id, client id, client secret, and service URL (as named in the error)
- Or disable Azure template downloads with -azure-template-disable-download
- Verify the service principal has read access to the container to avoid the next failure after this one
- Keep the full Azure variable set together in CI secrets so it cannot drift partially
Example fix
# before nuclei -update-templates -azure-container-name templates # after nuclei -update-templates -azure-container-name templates \ -azure-tenant-id ... -azure-client-id ... \ -azure-client-secret ... -azure-service-url core.windows.net
Defensive patterns
Strategy: validation
Validate before calling
func missingAzure(o *types.Options) []string {
var m []string
if o.AzureTenantID == "" { m = append(m, "AZURE_TENANT_ID") }
if o.AzureClientID == "" { m = append(m, "AZURE_CLIENT_ID") }
if o.AzureClientSecret == "" { m = append(m, "AZURE_CLIENT_SECRET") }
if o.AzureServiceURL == "" { m = append(m, "AZURE_SERVICE_URL") }
if o.AzureContainerName == "" { m = append(m, "AZURE_CONTAINER_NAME") }
return m
}
if options.UpdateTemplates && options.AzureContainerName != "" && !options.AzureTemplateDisableDownload {
if m := missingAzure(options); len(m) > 0 {
return fmt.Errorf("incomplete Azure config: %v", m)
}
} Prevention
- Store the complete Azure credential set as one CI secret group so it cannot drift partially
- Add a startup pre-flight mirroring validateMissingAzureOptions
- Use -azure-template-disable-download when Azure distribution is not needed
When it happens
Trigger: Running `nuclei -update-templates -azure-container-name c` without the tenant id, client id, client secret, or service URL (flags or env equivalents).
Common situations: Private template distribution via Azure Blob storage; CI with only part of the env vars exported; rotated service principal leaving one value empty.
Related errors
- aws s3 bucket details are missing. Please provide %s
- include directive preprocessing is disabled
- could not read profile file: %w
- prompt not found (read cap reached)
- could not parse profile YAML: %w
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/08359f5fd3d1aec7.
Report an issue: GitHub.