"PIX 경로 구축에 실패했습니다" 및 "요청된 대상에 대한 유효한 인증 경로를 찾을 수 없습니다"
twitter4j 라이브러리를 사용하여 twitter4j 라이브러리를 사용하여 twitter를 얻으려고 합니다.java.net.HttpURLConnection(어느쪽이든)했을 때 에 관한 했습니다.sun.security.validator.ValidatorException ★★★★★★★★★★★★★★★★★」sun.security.provider.certpath.SunCertPathBuilderException트위터를 하다
C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"
하지만 성공하지 못했다.트윗을 받는 절차는 다음과 같습니다.
public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
Query query = new Query("iphone");
QueryResult result;
result = twitter.search(query);
System.out.println("Total amount of tweets: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
}
오류는 다음과 같습니다.
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=d35baff5 or
http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 26 more
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- 브라우저에서 URL로 이동합니다.
- firefox - HTTPS (URL) 입니다.[ ] 를 합니다.
"more info" > "security" > "show certificate" > "details" > "export..". example. 파일 형식 example.cer를 지정합니다. - chrome - 왼쪽 사이트 아이콘을 클릭하여 주소 표시줄에 주소를 지정하고 "증명서" -> "상세" -> "내보내기"를 선택한 후 "더 인코딩된 이진, 단일 인증서" 형식으로 저장합니다.
Keystore JVM 키스토어 cacerts 파일)의합니다.
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.에
example.cer파일을 명령줄의 cacerts에 저장합니다(관리자 명령 프롬프트가 필요할 수 있습니다).
keytool -import -alias example -keystore "C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts" -file example.cer
은 '비밀번호'입니다.츠키다changeit
JVM/PC 를 재기동합니다.
출처 : http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html
새로운 twitter certs와 함께 Java 6를 설치하기 위해 증명서 파일을 작성하려고 몇 시간 동안 노력한 끝에, 저는 마침내 하나의 게시판에 코멘트가 담긴 믿을 수 없을 정도로 간단한 솔루션을 발견했습니다.Java 7 설치에서 cacerts 파일을 복사하고 Java 6 설치에서 cacerts 파일을 덮어씁니다.먼저 cacerts 파일을 백업하는 것이 가장 좋지만, 그 다음 새 파일을 복사하면 BOOM! 이 기능은 작동합니다.
Windows 의 cacerts 파일을 Linux 의 인스톨에 카피하면, 정상적으로 동작하는 것에 주의해 주세요.
은 is음음음음음음음음 the the the the the 、 the the 。jre/lib/security/cacertsJava jdk Java jdk. Java java jdk는 Java jdk입니다.
이걸로 다른 누군가가 몇 시간 동안 화를 덜었으면 좋겠다.
MY UI 접근법:
- 여기서 Keystore 탐색기 다운로드
- $JAVA_를 엽니다.HOME/jre/lib/보안/캐서트
- PW 입력: 변경(Mac에서는 changeme
- .crt 파일을 Import합니다.
CMD 라인:
keytool -importcert -file jetty.crt -alias jetty -keystore $JAVA_HOME/jre/lib/security/cacerts- PW 라고 합니다.
changeit사용 )(Mac에서는 Changeme 사용 가능)
1. 증명서 확인
브라우저에서 대상 URL을 로드하고 사이트의 인증서를 봅니다(보통 잠금 기호가 있는 아이콘으로 액세스할 수 있습니다).브라우저의 주소 표시줄 왼쪽 또는 오른쪽에 있습니다.) 만료되었거나 다른 이유로 인해 신뢰할 수 없습니다.
2. JRE 및 JDK의 최신 버전을 설치합니다.
새 버전에는 일반적으로 업데이트된 신뢰할 수 있는 인증서 세트가 함께 제공됩니다.
또한 가능하면 이전 버전을 제거합니다.이것에 의해, 오설정 에러가 명백하게 됩니다.
3. 구성을 확인합니다.
- JAVA_의 위치를 확인합니다.HOME 환경변수는 다음을 가리킵니다.
- 자바어IntelliJ 체체 :
- 파일 -> 프로젝트 구조...-> 프로젝트 설정 -> 프로젝트 -> 프로젝트 SDK:
- 파일 -> 프로젝트 구조...-> 플랫폼 설정 -> SDK
4. 새로운 Java 버전에서 키스토어 전체를 복사한다.
가능한 는, 「JDK」를.%JAVA_HOME%/jre/lib/security/cacerts@jeremy-goodell이 답변에서 시사하는 바와 같이 최신 JRE에서 새 파일을 제출합니다(백업 복사본을 먼저 만듭니다).
5. 키스토어에 증명서 추가
의 문제가 되지 않으면 을 사용하십시오.keytool증명서를 Java 키스토어에 저장하려면 다음 절차를 수행합니다.
keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>
증명서가 있는 파일은 @MagGGG가 답변에서 제시한 바와 같이 브라우저에서 얻을 수 있습니다.
주 1: 사이트 증명서에 대한 체인의 모든 증명서에 대해 이 절차를 반복해야 할 수 있습니다.루트부터 시작합시다.
2: § 2:<alias_name>의 키 키 중에서 .keytool에러가 표시됩니다.
실행할 수 있는 저장소의 모든 인증서 목록을 가져오려면:
keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
문제가 발생할 경우 저장소에서 인증서를 제거하는 데 도움이 됩니다.
keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
증명서 검증 점프에 사용됩니다.
경고 개발 목적으로만 사용하는 것은 안전하지 않습니다!
저는 이 문제를 수정하는 데 오랜 시간이 걸린다는 것을 알게 되었습니다.특히 자동 생성 인증서는 공식 인증서와 달리 매우 까다롭고 Java는 이를 그다지 좋아하지 않습니다.
다음 링크를 확인하십시오: Java에서 인증서 문제 해결
기본적으로 서버의 증명서를 Java Home 증명서에 추가해야 합니다.
- 인증서를 생성 또는 가져오고 Servers.xml에서 사용하도록 Tomcat을 구성합니다.
- 의 합니다.
InstallCert하며 다음 합니다.server[:port]원래 비밀번호는 Java 증명서("변경")에 적용되므로 비밀번호는 필요하지 않습니다. - 된 증명서를 할 수 있습니다.서버에 의해 제공된 증명서를 분석하여 사용자가 다음을 작성할 수 있도록 합니다.
jssecerts한 경우 가 "(Eclipse에서 실행한 경우)"로 합니다).Run -> Configurations를 참조해 주세요. - 을 수동으로
$JAVA_HOME/jre/lib/security
다음 단계를 수행한 후 인증서를 사용한 연결은 Java 내에서 예외를 생성하지 않습니다.
다음 소스 코드는 매우 중요하며, Oracle 블로그에서 사라졌으며, 제공된 링크에 있는 페이지만 발견되었으므로 참조할 수 있도록 답변에 첨부합니다.
/*
* Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Sun Microsystems nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/**
* Originally from:
* http://blogs.sun.com/andreas/resource/InstallCert.java
* Use:
* java InstallCert hostname
* Example:
*% java InstallCert ecc.fedora.redhat.com
*/
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* Class used to add the server's certificate to the KeyStore
* with your trusted certificates.
*/
public class InstallCert {
public static void main(String[] args) throws Exception {
String host;
int port;
char[] passphrase;
if ((args.length == 1) || (args.length == 2)) {
String[] c = args[0].split(":");
host = c[0];
port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
String p = (args.length == 1) ? "changeit" : args[1];
passphrase = p.toCharArray();
} else {
System.out.println("Usage: java InstallCert [:port] [passphrase]");
return;
}
File file = new File("jssecacerts");
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP
+ "lib" + SEP + "security");
file = new File(dir, "jssecacerts");
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}
System.out.println("Loading KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();
SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[]{tm}, null);
SSLSocketFactory factory = context.getSocketFactory();
System.out.println("Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(10000);
try {
System.out.println("Starting SSL handshake...");
socket.startHandshake();
socket.close();
System.out.println();
System.out.println("No errors, certificate is already trusted");
} catch (SSLException e) {
System.out.println();
e.printStackTrace(System.out);
}
X509Certificate[] chain = tm.chain;
if (chain == null) {
System.out.println("Could not obtain server certificate chain");
return;
}
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
System.out.println();
System.out.println("Server sent " + chain.length + " certificate(s):");
System.out.println();
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
System.out.println
(" " + (i + 1) + " Subject " + cert.getSubjectDN());
System.out.println(" Issuer " + cert.getIssuerDN());
sha1.update(cert.getEncoded());
System.out.println(" sha1 " + toHexString(sha1.digest()));
md5.update(cert.getEncoded());
System.out.println(" md5 " + toHexString(md5.digest()));
System.out.println();
}
System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
String line = reader.readLine().trim();
int k;
try {
k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
} catch (NumberFormatException e) {
System.out.println("KeyStore not changed");
return;
}
X509Certificate cert = chain[k];
String alias = host + "-" + (k + 1);
ks.setCertificateEntry(alias, cert);
OutputStream out = new FileOutputStream("jssecacerts");
ks.store(out, passphrase);
out.close();
System.out.println();
System.out.println(cert);
System.out.println();
System.out.println
("Added certificate to keystore 'jssecacerts' using alias '"
+ alias + "'");
}
private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(' ');
}
return sb.toString();
}
private static class SavingTrustManager implements X509TrustManager {
private final X509TrustManager tm;
private X509Certificate[] chain;
SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}
public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}
}
맥
Mac(Chrome 또는 Firefox)에서 사용할 수 있는 버튼이 없기 때문에 Mac에서는 허용되는 답변이 작동하지 않습니다.이 답변을 체크하고 증명서를 다운로드한 후 아래 설명된 다음 단계를 수행하십시오.
- 키 저장소에 설치된 모든 인증서를 나열합니다.
cd $JAVA_HOME/lib/security
keytool -list -keystore cacerts
주의:
- 는 다음과 같습니다.
changeit. - 의 경우 Java-8 을 합니다.
cd $JAVA_HOME/jre/lib/security
- 키스토어에 증명서를 Import하기 전에 키스토어를 백업합니다.
sudo cp cacerts cacerts.bak
- 다운로드한 증명서를 키스토어에 Import 합니다.
sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts
- 증명서가 키스토어에 저장되어 있는지 확인합니다.
sudo keytool -list -keystore cacerts -alias youralias
정보를 하려면 , 「 」를 추가합니다.-v 삭제:
sudo keytool -v -list -keystore cacerts -alias youralias
smtp.gmail.com의 증명서를 Import하고 싶었습니다.나한테 효과가 있었던 유일한 해결책은
이 인증서를 보려면 명령을 입력하십시오.
D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465" " " 사이의 합니다.
-----BEGIN CERTIFICATE-----★★★★★★★★★★★★★★★★★」-----END CERTIFICATE-----변환합니다.gmail.cer달려.
keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file C:\Users\Admin\Desktop\gmail.cer를 입력합니다.
changeit인증서를 가져오려면 "예"를 클릭하십시오.
Java 재시작
이제 명령을 실행하면 준비가 완료됩니다.
JDK와 JRE 1.8.0_112가 모두 시스템에 있을 때 상황은 조금 달랐습니다.
를 Import CA로 .[JDK_FOLDER]\jre\lib\security\cacerts이미 알려진 명령을 사용합니다.
keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>
그래도 같은 PKIX 경로 구축 실패 오류가 계속 발생하였습니다.
CLI 를 사용하여 CLI 디버깅 했습니다.java -Djavax.net.debug=all ... > debug.logdebug.log 파일에서 trustStore로 시작하는 행은 다음과 같습니다.실제로, 에 있는 cacerts 스토어를 가리킵니다.[JRE_FOLDER]\lib\security\cacerts
이 경우 해결방법은 JDK에서 사용되는 cacerts 파일(새로운 CA가 추가된 파일)을 JRE에서 사용되는 파일에 복사하여 문제를 수정하는 것이었습니다.
문제 배경:
프로젝트에서 mvn 클린 설치를 실행하려고 할 때 Netbeans IDE 클린 및 빌드 옵션을 통해 다음 오류가 발생했습니다.이 문제는 NET bins IDE/through 명령어프롬프트를 통해 다운로드 할 때는 증명서를 사용할 수 없지만 브라우저를 통해 파일을 다운로드할 수 있기 때문입니다.
오류:
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
해상도:
1. 해당 URL의 증명서를 다운로드합니다.
- "관리자로서 실행"하여 IE를 실행합니다(그렇지 않으면 증명서를 다운로드할 수 없습니다).
- IE-> https://url/local-repo 에 URL 을 입력합니다(이 경우는 이 URL 에 신뢰할
수 없는 증명서가 있습니다). - [증명서 오류] -> [증명서 표시]를 클릭하여 증명서를 다운로드합니다.
- [ Details ]탭 -> [ copy to file ]-> [ next ]-> [ DER encoded binary X . 509 . ]를 선택합니다.CER)
- 증명서를 특정 장소에 저장합니다.예: c:/user/syslog/product.cer
- 축하드립니다.사이트에 대한 인증서를 다운로드했습니다.
2. 이제 키 저장소를 설치하여 문제를 해결합니다.
- keytool 명령을 실행하여 다운로드한 키스토어를 기존 증명서 파일에 추가합니다.
- 명령어: 다음 명령어는 jdk(JAVA_HOME)의 bin 폴더에 있습니다.
C:\Program Files\Java\jdk1.8.0_141\jre\bin>keytool -importcert - file "C:/user/sheldon/desktop/product.cer" -alias product -keystore "C:/Program Files/Java/Java/jdk1.8.0_141/re/jre\cert\cert/cert/ac"입니다.
- 패스워드를 입력하도록 요구됩니다.keystore password 입력: "이 증명서를 신뢰하시겠습니까?"에 대해 "변경"을 다시 입력하십시오.[no]:, "yes"를 입력합니다.
명령줄 명령/출력 예시:
keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]: yes
Certificate was added to keystore
- Contgrats! 이제 "PKIX 경로 구축 실패: sun.security.provider.certpath"를 삭제해야 합니다.SunCertPathBuilderNetbeans IDE에 예외" 오류가 있습니다.
이것은 트위터 고유의 답변은 아니지만, 이 오류를 검색할 때 나타나는 질문입니다.웹 브라우저에서 유효한 증명서를 가진 것으로 보이는 웹사이트에 접속할 때 시스템이 이 오류를 수신하는 경우, 이는 아마도 해당 웹 사이트에 불완전한 증명서 체인이 있음을 의미합니다.
문제의 간단한 개요에 대해서는, 다음과 같습니다.인증 기관은 루트 인증서를 사용하여 오래된 인증서만 서명하지 않습니다.대신 인증국 플래그가 설정되어 있는(즉, 증명서에 서명할 수 있는) 중간 증명서에 서명합니다.그런 다음 CA에서 증명서를 구입하면 CSR에 이러한 중간 증명서 중 하나가 서명됩니다.
Java 신뢰 저장소에는 중간 인증서가 아닌 루트 인증서만 있을 수 있습니다.
잘못 구성된 사이트는 서명된 인증서만 반환할 수 있습니다.문제: 신뢰 저장소에 없는 중간 인증서로 서명되었습니다.브라우저는 캐시된 중간 증명서를 다운로드 또는 사용하여 이 문제를 처리합니다.이것에 의해, Web 사이트의 호환성이 최대화됩니다.그러나 Java와 OpenSSL과 같은 툴은 그렇지 않습니다.그러면 질문에서 오류가 발생합니다.
Qualys SSL 테스트를 사용하여 이 문제를 확인할 수 있습니다.사이트에 대해 실행해 보면
이 서버의 인증서 체인이 불완전합니다.
그게 확인되는군인증 경로와 추가 다운로드라는 텍스트도 볼 수 있습니다.
수정 방법: 서버 관리자는 중간 증명서도 반환하도록 웹 서버를 구성해야 합니다. Comodo의 경우, 은 「」, 「Comodo」, 「Comodo」, 「Comodo」의 입니다..ca-bundle파일은 편리합니다.를 들어 mod_ssl을하는 Apache mod_ssl을 사용합니다.SSLCertificateChainFile설정을 변경합니다.경우 해야 합니다.nginx는 SSL을 사용합니다.온라인에서 "불완전한 인증서 체인"을 검색하여 더 많은 정보를 찾을 수 있습니다.
이것은 해결책이지만, 이 문제에 대한 제 이야기의 형식입니다.
위에서 설명한 모든 해결책을 시도해 보니 거의 죽을 뻔했고(3일 동안) 아무 것도 효과가 없었습니다.
나는 모든 희망을 잃었다.
프록시의 배후에 있기 때문에 보안팀에 연락했더니 최근에 보안 정책을 갱신했다고 합니다.
나는 개발자들에게 알리지 않은 것에 대해 그들을 심하게 꾸짖었다.
나중에 모든 인증서가 포함된 새로운 "cacerts" 파일을 발급했습니다.
%J 안에 있는 cacerts 파일을 삭제했습니다.AVA_HOME%/jre/lib/security로 문제가 해결되었습니다.
따라서 이 문제에 직면한 경우 네트워크 팀에서도 이와 같은 문제가 발생할 수 있습니다.
위의 오류가 발생하는 이유는 JDK가 다수의 신뢰할 수 있는 CA(인증 기관) 증명서와 함께 'cacerts'라는 파일에 번들되어 있지만 이 파일에는 자체 서명된 증명서의 단서가 없기 때문입니다.즉, cacerts 파일에는 자체 서명 증명서가 Import되어 있지 않기 때문에 신뢰할 수 있는 엔티티로 취급되지 않기 때문에 위의 오류가 발생합니다.
위의 오류를 수정하려면 자기 서명 증명서를 cacerts 파일로 Import하기만 하면 됩니다.
먼저 cacerts 파일을 찾습니다.우리는 JDK의 위치를 알아내야 합니다.Eclipse나 IntelliJ Idea 등의 IDE를 통해 애플리케이션을 실행하고 있는 경우 프로젝트 설정으로 이동하여 JDK 위치를 확인하십시오.예를 들어 Mac OS에서 cacerts 파일의 일반적인 위치는 이 위치 /Library/Java/JavaVirtual Machines/{JDK_version}/Contents/Home/jre/lib/security 아래에 있습니다.JDK_version}}/jre/lib/security
cacerts 파일을 찾았으면 이 cacerts 파일로 자체 서명 증명서를 Import해야 합니다.자기 서명 증명서를 올바르게 생성하는 방법을 모르는 경우는, 마지막 문서를 확인해 주세요.
증명서 파일(.crt)이 없고 .jks 파일만 있는 경우 다음 명령을 사용하여 .crt 파일을 생성할 수 있습니다.이미 .crt/.pem 파일이 있는 경우 다음 명령을 무시해도 됩니다.
##keystore(.jks 파일) ###에서 증명서를 생성하려면
keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt
위의 절차에서는 selfsigned.crt라는 파일이 생성됩니다.증명서를 cacert로 Import 합니다.
Now add the certificate to JRE/lib/security/cacerts (trustore)keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}
예를 들어
keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts
이것으로, 애플리케이션을 재기동하면 정상적으로 동작합니다.그래도 작동하지 않고 SSL 핸드쉐이크 예외가 발생하는 경우.증명서에 등록되어 있는 도메인과는 다른 도메인을 사용하고 있는 것을 의미합니다.
자세한 설명과 단계별 해결 방법이 기재된 링크는 이쪽입니다.
반나절 동안 고군분투한 끝에 이 문제를 해결할 방법을 하나 더 찾아냈다.이것을 MAC 10.15.5(Catalina)로 해결할 수 있었습니다.다음의 순서에 따릅니다.
- 이 문제는 회사 프록시(Zscaler의 경우)를 실행하고 있을 때 발생합니다.
- 키 체인 액세스를 열고 CA 인증서를 내보냅니다.(CA 증명서, 파일-> 항목 내보내기 및 원하는 이름으로 저장)
- Java 폴더에서 기존 cacert 경로를 복사합니다(/Library/Java/JavaVirtual Machines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/certs).
- 터미널을 열고 Keytool 폴더(/Library/Java/JavaVirtual Machines/jdk1.8.0_251.jdk/Contents/Home/jre/bin)로 이동합니다.
- 다음 명령을 실행합니다.
- Keytool - importcert - file (키체인 액세스에서 내보낸 증명서에 대한 경로) -alias (이름 지정) -keystore (Java 폴더에서 기존 cacerts 경로)
- sudo Keytool -importcert -file / Users / Desktop / RootCA . cer - alias demo - keystore / Library / Java / Java Virtual Machines / jdk 1 . 8 . 0 _ 251 . jdk / Contents / Home / jre / lib / security / certs
- 패스워드를 요구해, 「changeit」라고 입력합니다.
- 확인을 요구합니다.Say : yes
이 모든 단계가 끝나면 이클립스를 종료하고 터미널에서 새 세션을 시작합니다.
" " " cacerts효과가 없었습니다.가 있는 후.-Djavax.net.debug=all 되었습니다.jssecacerts.
to Import »jssecacerts디어작작 작작작다다
같은 문제에 직면하고 있었습니다.다음의 간단한 순서로 해결했습니다.
1) 구글에서 Install Cert.java를 다운로드합니다.
2) javac Install Cert.java를 사용하여 컴파일합니다.
3) java InstallCert.java를 사용하여 호스트 이름과 https 포트를 사용하여 InstallCert.java를 실행하고 입력을 요구할 때 "1"을 누릅니다."localhost"를 신뢰할 수 있는 키스토어로 추가하고 다음과 같이 "jsecacerts"라는 이름의 파일을 생성합니다.
Java InstallCert localhost: 443
4) jsecacerts를 $JAVA_에 복사합니다.HOME/jre/lib/security 폴더
이 문제를 해결하는 주요 원인은 다음과 같습니다.
https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html
저는 백그라운드에서 fiddler가 실행 중이어서 인증서 오류가 발생했습니다.프록시 역할을 하기 때문에 닫히고 일식을 다시 시작합니다.
업데이트 사이트를 통해 Eclipse에 Oy-Eclipse 플러그인을 설치하려다 이 질문을 접하게 되었습니다.같은 SunCertPathBuilder를 받았습니다.예외 오류:
Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
다른 답변 중 일부는 이 질문의 주어진 상황에서 적절하고 도움이 되지만, 그럼에도 불구하고 제 문제에 도움이 되지 않고 오해를 불러일으키기도 했습니다.
제 경우 업데이트 사이트에 제공된 URL이 다음과 같습니다.
다만, 브라우저를 개입시켜 액세스 하면, 다음과 같이 리다이렉트 됩니다(추가된 「.github」에 주의해 주세요).
따라서 해결 방법은 업데이트 사이트를 추가할 때 업데이트 사이트 URL의 리디렉션 버전을 사용하는 것입니다.
8을 한 Windows 8에서 이 했습니다.pkcs12 store store에 저장하다cacerts키 스토어
스토어 : pkcs12 " " path :
C:\Apps\pkcs12.pfx
: Java cacert ":
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts
도구 : " " " " "
C:\Program Files\Java\jre1.8.0_151\bin
명령어프롬프트에서 한 후 (「」에서) 「keytool」로부터 .pkcs12로로 합니다.cacerts
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS
하다
destination password를 1 수신처 키스토어 패스워드 입력(패스워드는 인증되지 않으며 기본값은 "변경")
password (2. source keystore password (password)를 입력합니다.
하게 하려면 , 머신을 재기동합니다).
목표:
- https 접속 사용
- SSL 체인 확인
- 불온한 일에 대처하지 않다
- 런타임에 인증서 추가
- cacert에서 증명서가 손실되지 않음
방법:
- 자체 키 저장소 정의
- 증명서를 키스토어에 저장하다
- 커스텀 클래스로 SSL 디폴트콘텍스트 재정의
- ???
- 이익
내 Keystore 래퍼 파일:
public class CertificateManager {
private final static Logger logger = Logger.getLogger(CertificateManager.class);
private String keyStoreLocation;
private String keyStorePassword;
private X509TrustManager myTrustManager;
private static KeyStore myTrustStore;
public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
this.keyStoreLocation = keyStoreLocation;
this.keyStorePassword = keyStorePassword;
myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
}
public void addCustomCertificate(String certFileName, String certificateAlias)
throws Exception {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore) null);
Certificate certificate = myTrustStore.getCertificate(certificateAlias);
if (certificate == null) {
logger.info("Certificate not exists");
addCertificate(certFileName, certificateAlias);
} else {
logger.info("Certificate exists");
}
tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(myTrustStore);
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
setMytrustManager((X509TrustManager) tm);
logger.info("Trust manager found");
break;
}
}
}
private InputStream fullStream(String fname) throws IOException {
ClassLoader classLoader = getClass().getClassLoader();
InputStream resource = classLoader.getResourceAsStream(fname);
try {
if (resource != null) {
DataInputStream dis = new DataInputStream(resource);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
return new ByteArrayInputStream(bytes);
} else {
logger.info("resource not found");
}
} catch (Exception e) {
logger.error("exception in certificate fetching as resource", e);
}
return null;
}
public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
try {
InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(in, pass.toCharArray());
logger.info("Keystore was created from resource file");
return keyStore;
} catch (Exception e) {
logger.info("Fail to create keystore from resource file");
}
File file = new File(keystore);
KeyStore keyStore = KeyStore.getInstance("JKS");
if (file.exists()) {
keyStore.load(new FileInputStream(file), pass.toCharArray());
logger.info("Default keystore loaded");
} else {
keyStore.load(null, null);
keyStore.store(new FileOutputStream(file), pass.toCharArray());
logger.info("New keystore created");
}
return keyStore;
}
private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
IOException, KeyStoreException, NoSuchAlgorithmException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certStream = fullStream(certFileName);
Certificate certs = cf.generateCertificate(certStream);
myTrustStore.setCertificateEntry(certificateAlias, certs);
FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
myTrustStore.store(out, getKeyStorePassword().toCharArray());
out.close();
logger.info("Certificate pushed");
}
public String getKeyStoreLocation() {
return keyStoreLocation;
}
public String getKeyStorePassword() {
return keyStorePassword;
}
public X509TrustManager getMytrustManager() {
return myTrustManager;
}
public void setMytrustManager(X509TrustManager myTrustManager) {
this.myTrustManager = myTrustManager;
}
}
이 클래스는 필요에 따라 키스토어를 만들고 키스토어 내의 증명서를 관리할 수 있습니다.SSL 컨텍스트의 클래스:
public class CustomTrustManager implements X509TrustManager {
private final static Logger logger = Logger.getLogger(CertificateManager.class);
private static SSLSocketFactory socketFactory;
private static CustomTrustManager instance = new CustomTrustManager();
private static List<CertificateManager> register = new ArrayList<>();
public static CustomTrustManager getInstance() {
return instance;
}
private X509TrustManager defaultTm;
public void register(CertificateManager certificateManager) {
for(CertificateManager manager : register) {
if(manager == certificateManager) {
logger.info("Certificate manager already registered");
return;
}
}
register.add(certificateManager);
logger.info("New Certificate manager registered");
}
private CustomTrustManager() {
try {
String algorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
tmf.init((KeyStore) null);
boolean found = false;
for (TrustManager tm : tmf.getTrustManagers()) {
if (tm instanceof X509TrustManager) {
defaultTm = (X509TrustManager) tm;
found = true;
break;
}
}
if(found) {
logger.info("Default trust manager found");
} else {
logger.warn("Default trust manager was not found");
}
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{this}, null);
SSLContext.setDefault(sslContext);
socketFactory = sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
logger.info("Custom trust manager was set");
} catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
logger.warn("Custom trust manager can't be set");
e.printStackTrace();
}
}
@Override
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> out = new ArrayList<>();
if (defaultTm != null) {
out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
}
int defaultCount = out.size();
logger.info("Default trust manager contain " + defaultCount + " certficates");
for(CertificateManager manager : register) {
X509TrustManager customTrustManager = manager.getMytrustManager();
X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
out.addAll(Arrays.asList(issuers));
}
logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
X509Certificate[] arrayOut = new X509Certificate[out.size()];
return out.toArray(arrayOut);
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by custom trust manager");
return;
} catch (Exception e) {
}
}
if (defaultTm != null) {
defaultTm.checkServerTrusted(chain, authType);
logger.info("Certificate chain (server) was aproved by default trust manager");
} else {
logger.info("Certificate chain (server) was rejected");
throw new CertificateException("Can't check server trusted certificate.");
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
try {
if (defaultTm != null) {
defaultTm.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by default trust manager");
} else {
throw new NullPointerException();
}
} catch (Exception e) {
for(CertificateManager certificateManager : register) {
X509TrustManager customTrustManager = certificateManager.getMytrustManager();
try {
customTrustManager.checkClientTrusted(chain, authType);
logger.info("Certificate chain (client) was aproved by custom trust manager");
return;
} catch (Exception e1) {
}
}
logger.info("Certificate chain (client) was rejected");
throw new CertificateException("Can't check client trusted certificate.");
}
}
public SSLSocketFactory getSocketFactory() {
return socketFactory;
}
}
이 클래스는 싱글톤으로 작성되었습니다.기본값은 1개뿐이기 때문입니다.SSL 컨텍스트가 허용됩니다.이제 사용방법:
CertificateManager certificateManager = new CertificateManager("C:\\myapplication\\mykeystore.jks", "changeit");
String certificatePath = "C:\\myapplication\\public_key_for_your_ssl_service.crt";
try {
certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
} catch (Exception e) {
log.error("Can't add custom certificate");
e.printStackTrace();
}
CustomTrustManager.getInstance().register(certificateManager);
인증서 파일을 리소스 폴더에 보관하기 때문에 경로가 절대적이지 않기 때문에 이 설정에서는 작동하지 않을 수 있습니다.하지만 일반적으로 완벽하게 작동합니다.
저장소 URL이 HTTP에서도 작동하며 보안이 중요하지 않은 경우 settings.xml로 이동할 수 있습니다(항상 그렇지는 않습니다).%USERPROFILE%/.m2의 경우 HTTPS를 HTTP로 바꿉니다.<repository> ★★★★★★★★★★★★★★★★★」<pluginRepository>URL.
예를 들어 다음과 같습니다.
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>https://<artifactory>/libs-release</url>
</repository>
다음과 같이 대체해야 합니다.
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>https://<artifactory>/libs-release</url>
</repository>
자신의 하여 arg JRE를 했습니다.-Djavax.net.ssl.trustStore=
트러스트 스토어의 certs에 관계없이 이 에러가 발생하고 있습니다.문제는 arg 라인으로 전달된 속성들의 순서였습니다.-Djavax.net.ssl.trustStore=&-Djavax.net.ssl.trustStorePassword= -Dspring.config.location=&-jar httpshttps https rest를 으로 호출할 수 .
호스트가 방화벽/프록시 뒤에 있는 경우 cmd에서 다음 명령을 사용합니다.
keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>
<proxy_hostname> ★★★★★★★★★★★★★★★★★」<proxy_port>HTTP の http http http http http http http 。<remote_host_name:remote_ssl_port>인증 문제가 있는 리모트호스트의 1개(클라이언트 URL)와 포토를 사용하고 있습니다.
마지막으로 인쇄된 증명서 내용을 복사한다(증명서 시작 및 종료도 복사한다).텍스트 파일에 붙여넣고 .crt 확장자를 붙입니다.이 증명서를 java keytool 명령을 사용하여 cacerts로 Import하면 동작합니다.
keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
같은 문제가 발생했지만 Linux 머신에서 잘못된 jre를 업데이트했습니다.Tomcat이 다른 jre를 사용하고 있으며 CLI 프롬프트가 다른 jre를 사용하도록 설정되어 있을 가능성이 높습니다.
올바른 jre를 선택하고 있는지 확인합니다.
순서 1:
ps -ef | grep tomcat
다음과 같은 것이 표시됩니다.
root 29855 1 3 17:54 pts/3 00:00:42 /usr/java/jdk1.7.0_79/jre/bin/java
이제 다음을 사용합니다.
keytool -import -alias example -keystore /usr/java/jdk1.7.0_79/jre/lib/security/cacerts -file cert.cer
PWD: changeit
*.cer 파일은 다음과 같이 생성할 수 있습니다(또는 사용자 고유의 파일을 사용할 수 있습니다).
openssl x509 -in cert.pem -outform pem -outform der -out cert.cer
문제는 일식이 실제로 시도하고 있는 사이트를 연결할 수 없다는 것입니다.저는 비슷한 문제에 직면해 있으며, 아래 주어진 해결방법이 제게 효과가 있었습니다.
- Zscaler와 같은 서드파티 인터넷 보안 응용 프로그램을 끕니다.
- 접속되어 있는 경우는, VPN 의 절단도 필요하게 되는 경우가 있습니다.
감사해요.
JAVA_1-crt 파일을 {}에.HOME}/jre/security/cacerts, jdk.를 들면, 「 」로부터,jdk1.8.0_17로로 합니다.jdk1.8.0_231
이 에러가 아직 표시되는 경우
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target
다음 명령어를 실행한 후
keytool -import -alias certificatealias -keystore C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts -file certificate.crt
그러면 JDK에 문제가 있습니다.신뢰할 수 있는 공급자에서 JDK 설치를 시도합니다.신뢰할 수 있는 프로바이더로부터 재인스톨 하면, 이 문제는 발생하지 않습니다.
일반적으로 이러한 예외는 신뢰할 수 있는 증명서의 PATH에 불일치가 있을 때 발생합니다.안전한 통신을 위해 이 서버 인증서가 필요한 구성 또는 경로를 확인하십시오.
https://stackoverflow.com/a/36427118/1491414의 답변에 추가되어 있습니다.@MagGGG 감사합니다
- 관리자 권한이 있는지 확인하십시오.
- Windows OS에서는 기본 설치 위치가 프로그램파일이고 프로그램파일 사이에 공백이 있기 때문에 키스토어 경로(-keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\certs")에는 큰따옴표를 사용하십시오.
아래 방법으로 수정했습니다.
- 연결 문제가 있는 URL 복사
- Android Studio -> 설정 -> Http 설정으로 이동합니다.
- '연결 테스트'에서 해당 URL을 붙여넣고 확인을 누르십시오.
- OK클릭시 Android Studio에서 해당 URL의 증명서를 Import하도록 요구됩니다.
- 바로 그겁니다.달리 할 일도 없었고 내 문제도 없어졌다.스튜디오를 다시 시작할 필요도 없습니다.
언급URL : https://stackoverflow.com/questions/21076179/pkix-path-building-failed-and-unable-to-find-valid-certification-path-to-requ
'programing' 카테고리의 다른 글
| 내 URL 끝에 /?name=someonename을 추가할 때 Wordpress 404 오류가 발생함 (0) | 2023.03.19 |
|---|---|
| 실행 중인 Composer 반환: "입력 파일을 열 수 없습니다: composer.phar" (0) | 2023.01.30 |
| Django: 원시 SQL 쿼리에서 명명된 매개 변수 사용 (0) | 2023.01.30 |
| Python Panda - 두 데이터 프레임 간의 차이점 찾기 (0) | 2023.01.30 |
| Django 템플릿 변수가 있는 사전 값 검색 방법 (0) | 2023.01.30 |