-
描述疑问 通过查看上述文档,使用 openssl 生产签名,curl 获取配置,请求依然返回 401 Unauthorized,调试无果,请求支援。 复现 通过如下步骤可以复现: #!/bin/bash
# Function to sign a string with HmacSHA1
function signature() {
# Get arguments: timestamp in milliseconds, path with query, and secret
timestamp_ms="$1"
path_with_query="$2"
secret="$3"
# Define delimiter for string construction
delimiter="\n"
# Construct string to sign
string_to_sign="$timestamp_ms$delimiter$path_with_query"
# Use openssl for HmacSHA1 (assuming it's installed)
signature=$(echo -n "${string_to_sign}" | openssl dgst -sha1 -hmac "${secret}" -binary | openssl enc -base64 -A)
# Return the signature
echo "$signature"
}
# 请求 Apollo
timestamp_ns=$(date +%s%N) # Get current timestamp in milliseconds
timestamp_ms=$((timestamp_ns / 1000000))
secret="$1"
path_with_query="$2"
# url_encode="$(printf %s ${path_with_query} | jq -sRr @uri)"
signature=$(signature "$timestamp_ms" "${path_with_query}" "$secret")
#echo "Signature: $signature"
curl -v -H "Authorization: Apollo biz-sea-zl-api:${signature}" \
-H "Timestamp: ${timestamp_ms}" \
http://10.200.12.104:8080${path_with_query} 执行测试脚本 # 1.2 通过带缓存的Http接口从Apollo读取配置
# URL: {config_server_url}/configfiles/json/{appId}/{clusterName}/{namespaceName}?ip={clientIp}
test_sec.sh 3ec73558384d43f080510556896fec1f /configfiles/json/biz-sea-zl-api/default/system.yaml
或者
# 1.3 通过不带缓存的Http接口从Apollo读取配置
# URL: {config_server_url}/configs/{appId}/{clusterName}/{namespaceName}?releaseKey={releaseKey}&messages={messages}&label={label}&ip={clientIp}
test_sec.sh 3ec73558384d43f080510556896fec1f /configs/biz-sea-zl-api/default/system.yaml 响应如下:
期望 能通过 bash 脚本获取 Apollo 启用密钥的配置项,学习在 bash 中如何使用 openssl 加签名请求 Apollo 接口。 截图 无 额外的细节和日志
|
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 1 reply
-
嗨,@gotnix!很高兴再次看到你在这里提问。希望你近期一切都好! 根据您提供的上下文,我发现了一个类似的问题#5114,其中提供了一个修改后的脚本,可能会对您有所帮助。这个脚本在构造签名字符串时使用了 #!/bin/bash
# Function to sign a string with HmacSHA1
function signature() {
# Get arguments: timestamp in milliseconds, path with query, and secret
timestamp_ms="$1"
path_with_query="$2"
secret="$3"
# Define delimiter for string construction
delimiter=$'\n'
# Construct string to sign
string_to_sign="$timestamp_ms$delimiter$path_with_query"
# Use openssl for HmacSHA1 (assuming it's installed)
signature=$(echo -n "${string_to_sign}" | openssl dgst -sha1 -hmac "${secret}" -binary | openssl enc -base64 -A)
# Return the signature
echo "$signature"
}
# 请求 Apollo
timestamp_ns=$(date +%s%N) # Get current timestamp in milliseconds
timestamp_ms=$((timestamp_ns / 1000000))
secret="$1"
path_with_query="$2"
url_encode="$(printf %s ${path_with_query} | jq -sRr @uri)"
signature=$(signature "$timestamp_ms" "${url_encode}" "$secret")
#echo "Signature: $signature"
curl -v -G -H "Authorization: Apollo biz-sea-zl-api:${signature}" \
-H "Timestamp: ${timestamp_ms}" \
--data-urlencode "${url_encode}" \
http://10.200.12.104:8080 如果这个修改后的脚本仍然无法解决问题,可能需要进一步检查Apollo服务器的日志,以获取关于401错误的更详细信息。 另外,关于Apollo如何进行API请求的身份验证,Apollo通过为应用生成和管理访问密钥来进行身份验证。这个过程包括为每个访问密钥创建一个唯一的秘密,将其与应用ID关联,并根据需要启用或禁用这些密钥。 希望这些信息对您有所帮助,如果还有其他问题,欢迎继续提问。 Sources
|
Beta Was this translation helpful? Give feedback.
嗨,@gotnix!很高兴再次看到你在这里提问。希望你近期一切都好!
根据您提供的上下文,我发现了一个类似的问题#5114,其中提供了一个修改后的脚本,可能会对您有所帮助。这个脚本在构造签名字符串时使用了
$'\n'
作为分隔符,而不是"\n"
。此外,它还使用了jq
命令来进行URL编码,并在curl
命令中使用了-G
选项和--data-urlencode
参数。以下是修改后的脚本: