
# 常见问题
- Domain not registered或Service not registered 领域或微服务没有进行注册，请参考[将微服务注册到ACMS](https://support.huaweicloud.com/usermanual-wiseeye/appstage_04_0478.html)自行注册领域或微服务。
  
- connect timed out或read timed out 它有两种原因，connect timed out或read timed out:
  可以在sts.properties中添加超时配置，单位为毫秒：
  ```
  sts.connect.timeout=10000 //遇到 connect timed outsts.socket.timeout=10000 //遇到 read timed out
  ```
  
- Encrypt Permission Denied 这是因为管理台上注册微服务时，默认将微服务注册成了NORMAL。只有角色为PLATFORM的微服务才有权限调用加密接口。
  
- fail to init session key fail to init session key
  fail to get master key from sts
  这是因为集成了STS 1.0，也就是集成了sts-cse-sdk，从STS 1.0的服务器获取master key失败。因为STS 1.0的服务器需要业务自己去搭建，在没有搭建的情况下，当然会获取失败。
  如果已经搭建，检查业务的yaml文件中配置的environment参数和STS 1.0微服务中的environment是否一致，如果不一致则修改成一致。
  
- mac check in GCM failed 这个错误的原因就是密钥和密文不匹配导致无法解密。需要确认业务配置文件中的密文是从哪里来的？
  1. 通过IaC由配置中心下发： 检查IaC代码中配置的敏感配置项ID中的服务或微服务名是否属于该运行的微服务。
     - 服务级：Service/{ServiceName}/{SensitiveName}/{tag}
     
     - 微服务级：MicroService/{ServiceName}/{MicroServiceName}/{SensitiveName}/{tag}
      
  
  2. 通过StsAgent加密后，手工配置：
     检查加密的时候使用的服务级别servicekek还是微服务级别kek，和密文中的级别是否一致，服务名和微服务名是否和该运行的微服务一致？加密得到密文的STS环境和运行的STS环境是否一致？例如测试环境加密的密文是不能在生产环境解密。
     ```
     # 使用微服务kek加密
     # /opt/huawei/apps/wisesecurity/stsagent/stsagent encrypt -s ServiceName -m MicroServiceName -x -h 10.33.102.162:8080
     # 使用服务servicekek加密
     # /opt/huawei/apps/wisesecurity/stsagent/stsagent encrypt -s ServiceName -m MicroServiceName -ts ServiceName -x -h 10.33.102.162:8080
     ```
     
  
  3. 中间件的口令解密
     - 业务集成了Cloud Map对接中间件，业务不用关心口令解密的问题。
     
     - 业务使用sts agent加密明文口令后配置到相应管理台。参考[2]，看加密用的密钥和代码中解密的密钥是否对应（服务级还是微服务级kek），以及加密时使用的微服务名和服务名是否一致。
      
  
  4. 不同微服务的证书不可混用，业务使用自己微服务的证书及配置文件进行SDK的初始化，解密自己微服务的配置。
   
- Undefined provider local 当创建AESCryptor时，如果不用@指定KeyProvider，那么它会默认调用local KeyProvider。在使用kek或servicekek时，要指定KeyProvider为@sts。
  ```
  //错误
  AESCryptor cryptor = new AESCryptor.Builder().withKey("kek").withAlg(CryptoAlg.AES_GCM).build();
  //正确
  AESCryptor cryptor = new AESCryptor.Builder().withKey("kek@sts").withAlg(CryptoAlg.AES_GCM).build();
  ```
  
- 申请证书时Make sure haveged is running步骤或try active service步骤报错。 这是因为机器上没有启动haveged服务。haveged是一个随机数的熵的提供方，它可以解决在某些情况下，系统熵过低的问题。
  规避办法：在部署步骤前面加上sudo步骤；或者，到机器上，手动执行service haveged start命令，启动haveged服务。
  解决方案：在申请证书步骤前添加sudo和shell-exec步骤，确保haveged服务为启动状态。
  sudo systemctl enable haveged.service \&\& sudo systemctl start haveged.service非EulerOS可以使用sudo service haveged start命令。
  
- service ini config file not exists 这是因为STS在初始化时，找不到初始化配置文件（ini文件）或者微服务名称.sts.p12证书文件不存在。该文件是在部署微服务过程中，通过stsagent申请证书时生成的，默认路径在/opt/huawei/certs/{serviceName}/{microServiceName}，业务也可以通过相应参数来修改。
  解决办法：
  1. 首先确认配置的STS参数：
     - 通过配置文件配置的，查看sts/sts.properties文件，检查sts.config.path配置的文件是否存在。
     
     - 通过NUWA配置文件，检查microservice.yaml文件中nuwa.security.sts.configPath配置的文件是否存在。 nuwa:security:sts:serverDomain: 10.33.102.109:8080configPath: /opt/huawei/certs/{ServiceName}/{MicroServiceName}/{MicroServiceName}.ini
       
     
     - 通过Java Bean方式配置的，也就是通过类似以下代码初始化，检查sts.config.path配置的文件是否存在。 Properties properties = new Properties();properties.setProperty("sts.server.domain", "10.33.102.162:8080");properties.setProperty("sts.config.path", "D:/Test/ConsumerService/ConsumerMicroService1/ConsumerMicroService1.ini");StsKeyApi.initWith(properties);
       
     
     - 如果配置的是相对路径，则必须是相对于resource目录的路径。如果是在IDEA中运行使用，则检查target下是否有该文件，如果没有则重新compiler，IDEA最终是从target下获取resource文件。
      
  
  2. 另外，请确认部署过程中证书申请的步骤在业务安装和启动流程之前，如果业务先启动，之后才进行证书的申请，配置文件还未生成，也会出现找不到配置文件的问题。
   
- Fail to derive key with master key 这是因为STS没有初始化，就去调用了获取认证凭据的接口。
  解决办法：检查是否调用了StsKeyApi.init()或StsKeyApi.initWith(properties)。
  
- 如何解密微服务证书的口令 微服务证书的口令使用本地随机的根密钥和工作密钥加密，口令明文使用StsKeyStoreUtil.getKeyStoreValue()进行解密。
  
- Access Permission Denied 微服务集成STS SDK，获取相应微服务的Credentials时报如下错误Reqeust sts server fail, Request Token form xxxx\&yyyy failed， Access Permission Denied。 这是由于provider没有该微服务配置相应的ACL（Access Control List），导致没有权限获取访问该provider的credentials。
  
- Invalid api name STS Agent执行的时候报Invalid api name，这是由于 IaC 中使用了STS Agent高版本能力，但主机上STS Agent版本过低并且IaC中没有强制升级STS Agent导致的。通过IaC或手动更新STS Agent，使用1.1.5.100及之前的部署包时请打开force_install开关。
  
- 微服务有测试，镜像，海外，灰度等不同的环境，STS管理台如何管理这些敏感配置项？ STS管理台在不同站点是分开部署。同一站点下假如想区分不同的场景，例如生产和灰度，开发，测试和镜像，则可以使用敏感配置项标签区分。
  
- STS管理台敏感配置项最大长度是多少？ 5000个字符。
  
- 本地缓存的STS KEK，ServiceKEK以及认证凭据是如何保护？
  - key.json由本地随机生成的rootkey和workkey加密保护，kek.json由STS KEK保护。
  
  - 加密算法采用AES GCM。
   
- 部署过程report certificate to cms报错，提示"An unknown error occurred when report certificates!"。 首先检查/opt/huawei/certs/{service}/{microservice}下stscerttool.log中是否有错误信息。
  若日志中出现异常提示\[Errno -2\] Name or service not known，请使用以下命令确认系统版本是否为欧拉OS 2.9 \[EulerOS release 2.0 (SP9)\]：
  ```
  lsb_release -a
  ```
  1. 检查主机hostname是否超过64个字符，如果是的话，修改主机名。
  
  2. 主机存在无法解析出主机IP的问题，参考如下步骤检查：
     1. 检查/etc/nsswitch.conf中是否包含hosts项，且对应配置包含files或myhostname。
     
     2. 若添加配置files，检查/etc/hosts，添加当前主机的IP映射\[host_ip\] \[hostname\]，例如：10.33.100.100 host-10-33-100-100。 若添加配置myhostname，通常无需进行其他修改。
        
     
     3. 运行以下命令检查是否有其他异常。
        ```
        hostname -i
        python -c "import socket; print(socket.gethostbyname(socket.getfqdn(socket.gethostname())))"
        ```
        
      
   
- 如何手工注册微服务 使用IaC部署在WiseDBA上创建数据库实例，报没有注册STS的错误，如果业务还没有接入STS，可以在STS管理台进行手工注册该微服务。
  
- missed = in sensitive string value / missed value in sensitive string 解密敏感配置项的时候报missed = in sensitive string value错误，这是由于敏感配置密文格式不正确。敏感配置项密文格式如下：
  - kek加密密文格式： ENC(key=kek, value=xxxx)
  
  - servicekek加密密文格式： ENC(key=servicekek, value=xxxx)
   
- Unable to execute refresh credentials function 微服务日志STS SDK抛出如下异常，这是由于对端开启了STS的微服务认证，MapConnectCoreService\&MapConnectCoCreateService未给该微服务配置ACL。
  解决方案：让对端给该微服务配置ACL。
  ```
  com.huawei.wisesecurity.sts.sdk.exception.StsException: Unable to execute refresh credentials function for service.identity=MapConnectCoreService&MapConnectCoCreateService
  ```
  
- STS对JDK/JRE有什么要求？ 建议使用最新的1.8版本JDK/JRE。
  
- invalid common name STS SDK抛出如下异常：
  ```
  InvocationException: code=403;msg=errorCode=1002;errorMessage=invalid common name: AppGalleryPromotionUserService
  ```
  这是由于CSE的yaml文件中配置的微服务名和使用的STS微服务证书中的微服务名不一致导致的，使用部署时采用STSAgent自动签发的证书，里面是标准的PBI服务名和微服务名。
  
- STS管理台敏感配置修改后如何刷新到微服务的配置文件中？ 敏感配置项是通过配置服务发布到微服务配置文件中。在STS管理台修改后，需要在部署服务上重新发布修改的配置项。
  - 在配置中心找到该配置项
  
  - 重新发布该配置项：
   
- fail to parser work key json file 检查work_key.json格式是否正确，文件中的description，mac字段需要删除。
  
- Odd number of characters 业务加载工作密钥文件的时候报Odd number of characters异常，这是由于在STS管理台配置的hex编码的密钥明文的少或多了一个char。Hex编码字符串必须是偶数个字符。
  
- fail to get master key from sts 业务集成了STS 1.0的认证能力，需要从STS 1.0 Server上获取主密钥失败。STS 1.0 Server是部署在业务集群中，注册到业务同一个注册中心：
  - 在相应注册中心上检查WiseSecurity：SecurityTokenService微服务是否存在，如果不存在，则找到相应部署机器启动该微服务。
  
  - 检查业务的yaml文件中配置的environment参数和STS 1.0微服务中的environment是否一致，如果不一致则修改成一致。
   
- missed header x-sts-token / x-sts-session provider通过STS SDK认证请求时，从http消息中无法获取到相应的STS认证header信息。
  - 直接用postman访问，会缺少相应的认证凭据而失败。因此如果测试需要，可以将微服务的STS认证放通开关打开。放通开关配置在sts.properties配置文件中的sts.bypass.enable参数：true表示放通，false表示不放通，默认是不放通。
  
  - consumer侧开启了放通，但provider侧没有放通。
   
- sts.properties文件中未配置sts.config.path指定STS微服务证书加载路径（如果是IDEA中执行的，检查一下target下是否存在sts.properties）。STS SDK默认加载sts/sts.properties，业务也可以通过jvm启动参数sts.properties修改该文件的路径。 如果是通过NUWA初始化STS的，检查yaml文件中是否有配置nuwa.security.sts.configPath。
  ```
  nuwa:
     security:
       sts:
         serverDomain: 10.33.102.109:8080
         configPath: /opt/huawei/certs/{ServiceName}/{MicroServiceName}/{MicroServiceName}.ini
  ```
  如果通过Java Bean方式初始化，检查是否有设置sts.config.path配置项。
  ```
  Properties properties = new Properties();
   properties.setProperty("sts.server.domain", "10.33.102.162:8080");
   properties.setProperty("sts.config.path", "D:/Test/ConsumerService/ConsumerMicroService1/ConsumerMicroService1.ini");
   StsKeyApi.initWith(properties);
  ```
  
- STS管理台录入敏感配置项使用什么加密算法加密。 敏感配置项采用STS给业务分配的KeK/ServiceKek（256位）使用AES/GCM加密。
  
- Unable to resolve non-exist credentials StsCseClientFilter中发送请求时报如下异常和错误，这是由于无法获取到访问该微服务凭据抛出异常。检查服务初始化STS SDK时是否有异常（查看logback或log4j中配置的com.huawei.wisesecurity.sts包路径的日志文件）。
  
- invalid certificate 回答：确认服务名和证书名是一致的，证书是重新下发的，再判断业务连接的STS server1.0上的证书是否有修改。
  注意：需要确定当前环境连接的STS服务器是正确的，可以确认性能环境所对应的注册中心，然后在这个注册中心的portal界面上查找并确认STS 1.0是哪台服务器注册上去的。
  
- get sts token --Timestamp out of range/Timestamp is more earlier or later 这是由于STS开启防重放攻击（和STS服务器之间时间差小于5分钟），检查业务服务器的时间是否正确。
  
- configId can not be blank 部署服务或者NUWARutime获取敏感配置项时，请求要获取的敏感配置项的列表中有值为空。
  
- 管理台上服务下无法选到相应的微服务。 在安全管理台上配置敏感配置项、证书时，服务下只显示已经在相应环境下在STS上注册过的微服务。需要让站点的业务SRE在运维管理台上进行微服务注册。
  
- KeyStoreException: empty private key or certificate 出现该提示，是因为主机上STS实例证书（位于/opt/huawei/certs/{服务}/{微服务}/下）并不完整，很可能是由于前一次部署过程中出错导致，请检查该证书是否有效，可使用以下命令对证书进行检查。
  ```
  /opt/huawei/apps/wisesecurity/stsagent/stsagent check -s {服务} -m {微服务}
  ```
  如果提示校验错误信息，请重新执行stsagent-install部署步骤进行证书的重新申请。
  
- Unable to find SecretKey version=0 业务代码中使用STS密钥解密非STS加密的数据导致的错误。
  
- Micro service xxx\&yyy not registered 微服务没有在STS管理台进行注册。
  
- Fail to read service info from keystore STS SDK初始化时需要从STS的身份证书jks文件中读取服务和微服务信息，加载jks文件的时候异常了。一般是该jks文件有异常。
  SDK会根据service ini文件中的subject的CN项作为微服务名读取证书文件 {微服务名}.sts.p12
  ```
  [cert] subject = C=CN,O=Huawei,OU=Huawei CBG Cloud MicroService,CN=SecurityTokenServiceDemoSelfConsumer ip = 127.0.0.1
  ```
  
- invalid timestamp 检查业务主机的时间和标准时间差异是否超过5分钟。
  
- timeout awaiting response headers sts-go-sdk内的ResponseHeaderTimeout参数值设置过小，目前默认为100，在初始化时传入参数"sts.responseHeader.timeout"修改该值大小。
  
- not an SSL/TLS record client和server两边SSL不一致：client通过HTTP访问，但Server是提供的HTTPS的服务。
  如果是tomcat + NUWA/CSE，tomcat最终对外提供是http还是https是由tomcat的配置文件决定的，NUWA/CSE的yaml文件中定义的只是注册到注册中心告诉对端提供的是http还是https。
  
- Some config items not found iac provider在plan阶段会去校验敏感配置项是否存在于STS管理台，如果没有录入敏感配置项，或者敏感配置项的坐标不正确，则报此错，需要业务自己检查坐标是否正确。
  
- fail to get provider \*\* credentials consumer集成sts-go-sdk在获取provider端访问凭据的时候失败，需要在provider端配置ACL，管理台录入ACL后，需等十分钟才生效。
  启动时如果发现类似错误：
  either 'jasypt.encryptor.password', one of \['jasypt.encryptor.private-key-string', 'jasypt.encryptor.private-key-location'\] for asymmetric encryption, or one of \['jasypt.encryptor.gcm-secret-key-string', 'jasypt.encryptor.gcm-secret-key-location', 'jasypt.encryptor.gcm-secret-key-password'\] for AES/GCM encryption must be provided for Password-based or Asymmetric encryption
  那么可以按两个方向排查：
  - 检查启动类是否添加@EnableStsEncryptableProperties ，需要添加该注解，才能初始化StsStringEncryptor对象。
  
  - 如果已经添加，可能是因为spring context还未初始化完成，无法获取StsStringEncryptor对象。例如，Eureka应用的bootstrap.yml中如果包含敏感配置项，就会报这个错，需要将敏感配置项移到其他配置文件中，即可解决。
   
- Unable to refresh credentials for service SecurityTokenService\&SecurityTokenMicroService 该问题是STS初始化的时候，从kek.json或者keys.json获取本地密钥失败，导致无法从STS-Server获取凭据。
  解决方法：找到密钥的缓存地址，/${HOME}/.sts/服务名/微服务名/kek.json，删除kek.json和keys.json文件，重新启动即可。
  
 
