【问题标题】:Exception in thread "main" java.io.IOException: toDerInputStream rejects tag type 53 when accessing google spreadsheets线程“主”java.io.IOException 中的异常:访问谷歌电子表格时,toDerInputStream 拒绝标签类型 53
【发布时间】:2015-09-03 07:32:47
【问题描述】:

尝试访问 Google 电子表格。但是,上面的错误正在显示。我使用developers.google.com 的客户端ID 创建了.p12 文件。请让我知道是什么问题。完整错误如下:

线程“main”中的异常 java.io.IOException: toDerInputStream 拒绝标签类型 53 在 sun.security.util.DerValue.toDerInputStream(未知来源)在 sun.security.pkcs12.PKCS12KeyStore.engineLoad(未知来源)在 java.security.KeyStore.load(未知来源)在 com.google.api.client.util.SecurityUtils.loadKeyStore(SecurityUtils.java:82) 在 com.google.api.client.util.SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.java:115) 在 com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder.setServiceAccountPrivateKeyFromP12File(GoogleCredential.java:670) 在 testExcelAuth.testExcelAuth.main(testExcelAuth.java:27)

下面是我正在使用的代码:

package testExcelAuth;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed;
import com.google.api.services.drive.DriveScopes;


public class testExcelAuth {

  public static void main(String[] args) throws Exception {
    ArrayList scopes = new ArrayList();
    scopes.add(0, DriveScopes.DRIVE);
    scopes.add(1, "https://spreadsheets.google.com/feeds");
    GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(new NetHttpTransport())
        .setJsonFactory(new JacksonFactory())
        .setServiceAccountId("rkulkarni@securet.in")
        .setServiceAccountPrivateKeyFromP12File(newFile(
       ".\\src\\testExcelAuth\\key.p12"))
        .setServiceAccountScopes(scopes).build();

    credential.refreshToken();

    SpreadsheetService service = new SpreadsheetService("tmp");
    service.setOAuth2Credentials(credential);

    // Define the URL to request. This should never change.
    URL SPREADSHEET_FEED_URL = new URL(
        "https://spreadsheets.google.com/feeds/spreadsheets/private/full");

    // Make a request to the API and get all spreadsheets.
    SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL,
        SpreadsheetFeed.class);
    List<SpreadsheetEntry> spreadsheets = feed.getEntries();

    // Iterate through all of the spreadsheets returned
    int i = 0;
    for (SpreadsheetEntry spreadsheet : spreadsheets) {
      ++i;
      System.out.println(spreadsheet.getId());
    }
    System.out.println("Done " + i);   
  }
}

【问题讨论】:

  • 创建后是否关闭了文件。还要检查你是否对文件有读/写访问权限。有时第三方创建的文件有一些设置使其无法访问

标签: java


【解决方案1】:

解决方案:使用其他浏览器,最好是谷歌浏览器。

遇到了同样的错误,事实证明使用 Internet Explorer(或 Microsoft Edge)下载密钥是问题所在。我从 chrome 登录到我的开发控制台,再次下载了密钥文件,瞧,它可以工作了。

我怀疑原因是在 IE 上它以 base-64 编码格式下载,而在 Chrome 等中它被保存为二进制文件。

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多